与使用ImageReader(OpenGL-黑白,ImageReader-彩色)保存摄像机框架相比,为什么使用OpenGL渲染摄像机框架(然后将其保存)会产生锯齿图像?两者都使用相同的尺寸。
此问题的背景/细节:
我正在使用Camera2和GLES(不超过GLES31)构建ImageReader的非阻塞版本,目的是在不中断预览的情况下提取高分辨率的静态相机帧。
该设置使用TextureView进行预览,并使用GLSurfaceView捕获屏幕外的帧。 GLSurfaceView具有一个简单的渲染器和着色器,可将GL_TEXTURE_EXTERNAL_OES绘制到可从中提取原始图像数据的帧缓冲区。
在我的测试设备上,尺寸设置如下:相机传感器尺寸为3264x2448(通过CameraCharacteristics获得)
GLSurfaceView具有defaultBufferSize 3264x2448和布局3264x2448。格式也通过getHolder()。setFormat(ImageFormat.JPEG)设置为JPEG,并且JPEG质量为100
帧缓冲区设置为3264x2448
在我看来,这将导致相机框架以1对1的方式转移,但显然不是这种情况。
我尝试了其他几个尺寸,例如匹配屏幕尺寸,从StreamConfigurationMap中选择合适的尺寸,自定义尺寸,所有这些都会导致锯齿状输出。好像总是在后台进行一些上采样或下采样(GL_TEXTURE_EXTERNAL_OES实际上以不同的尺寸出现?)。
感谢您对此主题的任何投入,因为我在这一点上已经坚持了数周。
与使用ImageReader(OpenGL-黑白,ImageReader-彩色)保存摄像机框架相比,为什么使用OpenGL渲染摄像机框架(然后将其保存)会产生锯齿图像?两者都使用相同的...
您是否使用SurfaceTexture提供的变换矩阵来变换GL中的纹理输入?由于某些渲染路径中的某些复杂性,默认变换将图像的边框缩小1个像素: