我在我的Android应用程序中使用SurfaceView显示实时摄像头预览图像。 SurfaceView覆盖了竖屏屏幕的整个宽度和一部分高度。
我尝试设置各种预览大小,因此预览具有扭曲的宽高比,矮胖或高瘦。
我打印了调试信息,显示实际预览显示大小和可用的预览相机大小,以便我可以计算出宽高比误差。
Screen size available for preview: w*h:1200*1646; Aspect ratio: 0.73
Rotation: 0; finalCameraRotation: 90; sideways: true
Supported Preview size: w*h:1080*1920: AspectRatio: 0.56: Error: -22.84%
Supported Preview size: w*h:768*1280: AspectRatio: 0.60: Error: -17.70%
...
通常情况下,我会选择纵横比误差最小的预览尺寸,但这次我在进行实验。
List<Camera.Size> ss = parameters.getSupportedPreviewSizes();
...
Camera.Size s = ss.get(pickOne);
parameters.setPreviewSize(s.width, s.height);
...
camera.setParameters(parameters);
...
camera.startPreview();
我通过将相机对准白色正方形并使用Eclipse截屏,然后使用Photoshop的标尺工具测量截屏中白色正方形的图像来测量预览显示的长宽比误差:
![screenshot of Photoshop measuring square](https://istack.dev59.com/Evu3x.webp)
我测量了正方形在屏幕像素上的
x
和y
大小,并计算出1-(y/x)
,这应该与上面调试日志中预测的长宽比误差相同。我在以下设备上进行了测试:
- Alcatel 995, Android 4.0.4
- Samsung Note 2, Android 4.4.2
- Google Nexus 7, Android 4.4.4
- Google Nexus 5, Android 5.0
Supported Preview size: w*h:768*1024: AspectRatio: 0.75: Error: 2.87%
好像有其他程序在我设置最佳预览大小后进行修复。我实际上编写了代码等待10秒钟并从相机中读取预览大小,而它正是我设置的大小,但显示并没有反映出来。无论我设置什么预览大小,显示总是最佳的。
Nexus 7的预览大小有什么奇怪的地方吗?
我知道我的setPreviewSize
正在做某些事情,因为我可以将预览设置为144 * 176px,然后我会在显示屏上看到奇怪的上采样像素化伪影。但它仍然具有几乎正确的宽高比!