Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SurfaceTexture大小是如何定义的?_Android_Camera_Textures_Opengl Es 2.0 - Fatal编程技术网

Android SurfaceTexture大小是如何定义的?

Android SurfaceTexture大小是如何定义的?,android,camera,textures,opengl-es-2.0,Android,Camera,Textures,Opengl Es 2.0,我正在使用SurfaceTexture绘制相机预览,需要知道纹理的大小+过程中发生的情况 假设设备支持的摄像头预览大小为: 1280720、1024576960、720800600、800480、768576736552等 很明显,这些尺寸与标准纹理尺寸2048x2048、2048x1024、1024x1024之间不匹配 我能想到以下情况,但我不确定: 1,表面纹理的大小为选定的预览大小,例如1280 x 720,但这不是pow2格式,可能意味着兼容性问题 2、表面纹理包含在pow2格式的下

我正在使用SurfaceTexture绘制相机预览,需要知道纹理的大小+过程中发生的情况

假设设备支持的摄像头预览大小为:

1280720、1024576960、720800600、800480、768576736552等

很明显,这些尺寸与标准纹理尺寸2048x2048、2048x1024、1024x1024之间不匹配

我能想到以下情况,但我不确定:

1,表面纹理的大小为选定的预览大小,例如1280 x 720,但这不是pow2格式,可能意味着兼容性问题

2、表面纹理包含在pow2格式的下一个尺寸内,未转换,例如1280x720将包含在2048 x 1024纹理内,无拉伸,部分纹理未使用

3、表面纹理的大小被放大以适应下一个pow2纹理(甚至可能被缩小),图像比例丢失,质量也受到影响。例如1920 x 1080延伸至2048 x 2048

4、还有其他的可能性吗


摄影机预览是如何映射到纹理的,以及最终如何定义纹理大小?

实际上,在预览时,可以设置缓冲区以“保持”大分辨率

Size mPreviewSize;

CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);

String cameraId = manager.getCameraIdList()[0];
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);

StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];

SurfaceTexture texture = mTextureView.getSurfaceTexture();
// We configure the size of default buffer to be the size of camera
// preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());

我猜它可以是这三个选项中的任意一个,具体取决于供应商的具体实现。您应该使用SurfaceTexture.getTransformMatrix来获取纹理坐标(s,t)的贴图。这种转换可以为每种情况进行映射。谢谢你的想法。我问这个问题的原因是,与库存相机相比,我在某个地方的质量正在下降。我得到了轻微的锯齿状边缘,好像它经历了其他有损变换(是的,我使用的是线性滤波器)。也许我的1280x720预览大小是通过1024px纹理传送的。如果我有办法检查纹理大小,它可以确认它是否真实。我之前检查过getTransformMatrix以及opengl投影,它们似乎没有任何相对转换(所有(s,t)坐标为1或0)。在这种情况下,mPreviewSize是什么?我希望将其设置为我的设备能够支持的最大相机分辨率将其设置为相机支持的最大值