我有一个SurfaceView可以在我的Android应用中显示实时相机预览图像。 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标尺工具测量屏幕截图中白色方块的图像。
我在屏幕像素中测量了平方的x
和y
大小并计算了1-(y/x)
,这应该与上面调试日志中预测的宽高比错误相同。
我试过
具有各种宽高比,从平方误差多达25%,并且在所有这些中,我在预测中测量的宽高比在预测的约1%内。 (有错误,相机可能不是直接的,可能有点失焦......)
Google Nexus 7除外。
无论我为Nexus 7设置了什么样的预览尺寸,测量的宽高比都高约2%,这恰好是可用的最佳宽高比:
Supported Preview size: w*h:768*1024: AspectRatio: 0.75: Error: 2.87%
就好像其他程序即将推出并在我设置后修复最佳预览尺寸。我实际上放入代码等待10秒并从相机读回预览大小,这是我设置的,但显示没有反映出来。无论我设置什么样的预览尺寸,显示屏始终是最佳的。
Nexus 7上的预览尺寸是否有些奇怪?
我知道我的setPreviewSize
正在做某事,因为我可以将预览设置为144 * 176px,然后我会在显示中看到奇怪的上采样像素化伪像。但它仍然具有几乎正确的宽高比!
答案 0 :(得分:0)
无论我为Nexus 7设置了什么预览尺寸,所测量的纵横比都大约高2%,这恰好是可能的最佳纵横比:
Supported Preview size: w*h:768*1024: AspectRatio: 0.75: Error: 2.87%
[…] Nexus 7上的预览尺寸有些奇怪吗?
Nexus 7的错误在于其所有预览尺寸均包含4:3的图像数据,并已扩展为预览帧的尺寸。 换句话说: Nexus 7取景器框架的内容始终是将1920×1440 px图像 1 (4:3)不成比例地缩放为选定的实时摄像机预览尺寸。这意味着可以通过拉伸来进行缩放,而不会裁剪掉任何东西。
现在,这就是为什么您观察到问题中描述的行为的原因:偶然,您1646×1200
的可用屏幕空间接近4:3。因此,将Nexus 7提供的4:3图像数据缩放到该大小将始终导致观察到的低长宽比错误(2.87%)。缩放到预览大小的中间步骤不会改变任何内容,因为以下缩放到可用屏幕大小会撤消该操作。
您很幸运,您的可用屏幕尺寸为4:3,可以在Nexus 7上正常预览。但是,其他所有人都将无法克服Nexus 7所显示的自然尺寸显示失真的事实。 / p>
例如:Nexus 7报告了许多可用的预览尺寸,其宽高比不是4:3;让我们以1920×1080(宽高比1.78)为例。在1920×1080矩形中显示4:3的帧内容会导致图像拉伸。
因此Nexus 7的预览行为肯定存在错误。错误似乎是4:3预览用于静态图像,而19:10预览用于视频图像,但随后这些帧总是错误地包含4:3图像数据。或相反:摄像机报告两种类型的预览尺寸,而其当前模式仅允许4:3或19:10预览。
必须有一种适当的方法来解决此问题,因为处于视频模式的Nexus 7本机摄像头应用程序可提供19:10的预览而不会失真(意味着它不包含4:3的图像数据)。
如@fljau在other answer中所报告的那样,将相机的静止图像拍摄分辨率设置为与所选预览的宽高比匹配将解决此问题。然后,您可以以报告的自然尺寸显示摄像机实时预览,并且在屏幕上不会看到圆形物体的变形。
我只是在Qt QML中这样做,如下所示:
Camera {
imageCapture {
resolution: "1920x1080"
}
viewfinder.resolution: "1920x1080"
}
不必为此设置Camera { captureMode: CaptureStillImage }
。静止图像的分辨率会影响任何captureMode
的预览图像数据,这是一个副作用(更清楚的是,这确实是一个错误)。
对于QML中与模型无关的通用解决方案,您可以先通过available viewfinder resolutions,然后通过available still image resolutions,然后如上所述将imageCapture.resolution
设置为与最大匹配的值(根据您的期望)取景器的纵横比分辨率。
当您知道预览帧中数据的实际长宽比时,可以不按比例缩放相机实时预览以匹配此长宽比。基本上是问题作者的误操作(误差幅度在2.87%之内)。
我还尝试将捕获模式设置为“视频”,希望它会导致19:10“视频样式”预览帧内容无法正常工作。 (作为参考,我在Qt QML中使用Camera { captureMode: Camera.CaptureVideo }
进行了尝试。)这无效。
1 1920×1440像素的图像只是一个4:3图像,其大小足以覆盖最大支持的1920×1080像素的预览尺寸。出于参数的考虑,我增大了该尺寸,以便缩放不会丢失您在预览中看到的像素。