Android camera2到帧缓冲区锯齿状图像?

Android camera2到帧缓冲区锯齿状图像?,android,opengl-es,opengl-es-2.0,android-camera2,Android,Opengl Es,Opengl Es 2.0,Android Camera2,与使用ImageReader(OpenGL-B/W,ImageReader-Color)保存相机帧相比,为什么使用OpenGL渲染相机帧(然后保存)会创建锯齿状图像?两者使用相同的尺寸 此问题的背景/详细信息: 我正在使用Camera2和GLES(高达GLES31)构建一个非阻塞版本的ImageReader,以便在不中断预览的情况下提取高分辨率的静态相机帧 设置使用TextureView进行预览,使用GLSurfaceView在屏幕外捕获帧。GLSURFACHEVIEW有一个简单的渲染器和着色

与使用ImageReader(OpenGL-B/W,ImageReader-Color)保存相机帧相比,为什么使用OpenGL渲染相机帧(然后保存)会创建锯齿状图像?两者使用相同的尺寸

此问题的背景/详细信息:

我正在使用Camera2和GLES(高达GLES31)构建一个非阻塞版本的ImageReader,以便在不中断预览的情况下提取高分辨率的静态相机帧

设置使用TextureView进行预览,使用GLSurfaceView在屏幕外捕获帧。GLSURFACHEVIEW有一个简单的渲染器和着色器,用于将GL_纹理_外部_OES绘制到帧缓冲区上,从中可以提取原始图像数据

在我的测试设备上,尺寸设置如下: 摄像头传感器尺寸为3264x2448(通过摄像头特性获得)

GLSURFACHEVIEW具有defaultBufferSize 3264x2448和布局3264x2448。使用getHolder().setFormat(ImageFormat.JPEG)将格式设置为JPEG,JPEG质量为100

帧缓冲区设置为3264x2448

在我看来,这应该会导致相机帧的1:1转换,但显然不是这样

我尝试了其他几个维度,如匹配屏幕大小、从StreamConfigurationMap中选择合适的维度、自定义维度,所有这些都会导致锯齿状输出。就好像在背景中总是会发生一些上下采样(GL_纹理_外部_OES实际上以不同的维度出现?)


任何关于这个话题的意见都是非常感谢的,因为我已经在这个问题上坚持了好几个星期了

是否使用SurfaceTexture中提供的变换矩阵变换GL中的纹理输入?由于某些渲染路径中的某些复杂性,默认变换会将图像的边界缩小1像素:

所以,如果你使用它,你可以考虑尝试编写自己的转换以避免收缩,因为这对你来说不必要。

除此之外,在GLSurfaceView上设置格式在这里没有影响;无论如何,GL渲染会覆盖所有这些


(需要注意的是,在某些设备上,最大传感器分辨率可能会超过GLES支持的最大纹理大小,因此请小心)。

我已经尝试了一些有关矩阵的方法,按原样应用它,根本不使用它,并且我自己也做了一些实验。但结果基本相同。还有几个像素的收缩,在这种大小的纹理上会很明显吗?在我的测试中,它看起来更像是来自相机的源纹理是3/4大小,然后进行了上采样(或者沿着这些线)。但我会双击这个区域,继续使用矩阵进行实验。了解图像格式并不重要