Android OpenGL YUV 旋转花屏解决、Camera获取图像

一个自拍app,如何获取我们的surface view的截屏?

在Camera的onPreviewFrame回调中(继承的PreviewCallback接口)。我们可以获取到data数组,里面存放着就是实时的图片


data数组转文件为null,且转bitmap也为null怎么办?

data数组里确实存放的是图片,但是格式不对,是YUV420格式。需要进行一个转换。所以采用open gl包下的YuvImage这个类可以解决转化的问题,他有一个compressToJpeg方法。


转换成jpg格式,存到手机文件中,发现图片与拍摄出来的不符合,是经过90度旋转的图像怎么办(这里采用的是手机前置摄像头)?

对byte数组进行1.旋转2.镜像翻转(避免获取出来是反的)即可。再给算法处理后的新数组交给YUV去转换即可。


转换出来发现方向是对了,但是花屏了怎么办(这里是屏幕中出现了4个人并且重影了)?

是因为对byte数组旋转后,比如原来是100*200,旋转后就成了200*100,这个时候你不能把100,200分别交给YUV的宽高了,因为你大小都没指定对,解码自然会错误。而是应该给200,100。


代码

图片数组

public void onPreviewFrame(byte[] data, Camera camera) {
 

就是这个data


顺时针旋转270度代码

private byte
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OpenGL PBO是OpenGL中的一个扩展,它允许通过在图形处理单元(GPU)上创建一个像素缓冲对象(PBO),将数据从CPU传输到GPU,然后可以使用这些数据在纹理中显示图像。 在使用PBO和YUV420p格式的纹理显示图像之前,我们需要将YUV420p格式的图像数据转换为适用于OpenGL纹理的格式。YUV420p是一种常见的视频图像格式,它包含一个与图像分辨率相同的Y分量(明亮度)和两个与图像分辨率的四分之一相同的UV分量(色度)。Y分量与图像分辨率相同,而UV分量的分辨率被降低以节省存储和传输带宽。 首先,我们需要创建一个纹理,并将它与PBO关联。然后,我们可以将YUV420p数据传输到PBO中。将数据传输到PBO的过程涉及到将Y、U和V分量的数据按照特定的布局传输到PBO中。我们可以使用glBufferData函数将数据传输到PBO。 接下来,我们需要将PBO中的数据绑定到纹理,并对纹理进行设置以正确地显示图像。我们可以使用glBindTexture函数来绑定纹理,并使用glTexSubImage2D函数将PBO中的数据传输到纹理中。 最后,我们可以使用OpenGL的渲染管线将纹理中的图像显示在幕上。我们可以使用一个简单的顶点着色器和一个片段着色器将纹理中的图像转换为可视化的图像。 总结起来,使用OpenGL PBO和YUV420p纹理可以更高效地显示图像。通过将图像数据传输到PBO中,并将PBO与纹理关联,可以在GPU上进行图像处理和渲染,从而提高了图像显示的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值