7

我已经扩展了一个 SurfaceView 来显示一个非常简单的相机应用程序的相机源。为了找到每个设备的最佳预览尺寸,我使用了这个示例代码,它在我见过的几乎所有开源相机应用程序中都有使用:

    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    double minDiff = Double.MAX_VALUE;
    for (Camera.Size size : sizes) {
        if (Math.abs(size.width - width) < minDiff) {
        screenWidth = size.width;
        screenHeight = size.height;
        minDiff = Math.abs(size.width - width);
        }
    }

到目前为止,一切都完美无缺。

现在,由于应用程序的性质,我必须在会话过程中将两个位图保留在内存中,并且为了简单起见(避免测试期间出现内存问题),我对 PICTURE SIZE 使用了相同的代码(替换了getSupportedPreviewSizes() 和 getSupportedPictureSizes())。尽管我必须决定一些其他方式来为每个设备选择最佳图片尺寸,但在大多数设备上一切都很好。

最近,在 Nexus 4 设备上进行测试时,上述循环未能选择最佳图片尺寸。经过调查,我发现 getSupportedPictureSizes() 函数返回一个值,即 1280*960,Nexus 4 相机实际上并不支持该值。那么,如何解决这个问题呢?我的意思是,这个函数不应该只返回设备的 CAMERA 支持的那些值吗?我确信会有其他设备存在相同的问题,我将无法对其进行测试。关于如何解决这个问题的任何线索?

更新:发生的事情是它接受了错误的参数而没有任何错误,并且它返回的图像失真,我也会尝试在这里获取图片。此外,没有运行时异常。

4

3 回答 3

6

我在 LG Lucid(型号 VS840 4G)上遇到了同样的问题。基本上,getSupportedPictureSizes()返回这些尺寸:

Size        Aspect Ratio
2560x1920   (1.3333333333333333)
3072x1728   (1.7777777777777777)
2048x1536   (1.3333333333333333)
2304x1296   (1.7777777777777777)
1536x864    (1.7777777777777777)
1280x960    (1.3333333333333333)
640x480     (1.3333333333333333)

如果我们调用setPictureSize()任何具有 1.7 纵横比的尺寸,相机硬件不会抛出任何错误,但它会返回一个失真的图像:

来自 LG Lucid 的失真结果样本,显示了似乎是用错误步幅解释的像素缓冲区

我尝试了许多技术来让相机驱动程序承认这个尺寸并不真正支持,包括检查结果getPictureSize()getSupportedPictureFormats()调用setParameters(). 我找不到任何泄露这种行为的东西。

为了解决这个问题,我们现在模仿股票相机应用程序的行为:我们尝试从getSupportedPictureSizes()列表中找到“首选”尺寸,然后再选择最大的尺寸(由宽度 * 高度计算)。由于首选尺寸的纵横比均为 1.333 (4:3),因此可以解决此设备上的问题。

请参阅相机应用程序源代码,其中设置了值(第 111 行)和它喜欢的硬编码大小(第 63 行)以了解确切的实现。

于 2013-06-06T16:18:31.480 回答
1

那里实际上是什么,但是,总结:感谢谷歌!

  • 一些设备支持 1.33
  • 一些设备支持 1.77

在我的测试场景中,一个 4.3 的 Nexus 4 和另一个 4.4 的 Nexus 4都不支持 1.33,1.77 ...

我不能说那里有多少设备,或者实际上是不受支持的类型(上面提到了不同的方式)..所以基本上只有选择。让用户决定。如果有问题 -> 提供更改纵横比的选项。

我现在是这样做的。

希望这对某人有帮助->祝你好运:)

于 2014-04-10T21:59:09.270 回答
1

我相信 Nexus 4 上的辅助面部摄像头支持 1280x960 图片。我不知道为什么设备会报告“混合”尺寸,通常每个摄像头都会自己回答。

我可以确认有些设备的相机功能存在缺陷,尽管我在预览尺寸方面的经验比图片尺寸方面的经验要多。

当您选择错误的尺寸时,可能会发生不同的事情。camera.setParameters()有时,如果您选择不受支持的大小,您将收到 RuntimeException 。有时,设备会默默接受参数,但如果你再问getParameters(),你会发现图片大小并没有改变,或者不是你问的那样。一些设备的谎言更进一步:它们假装设置了所需的大小,但实际输出却不同。例如 Galaxy Nexus 假装支持 320x240 视频,但您在预览回调中获得的缓冲区大小为 640x480。

Nexus 4 的另一个“不错”功能是它显然对 android.camera.front功能很敏感(请参阅Frontal Camera Image Distortion

我已经用 Nexus 4 v.4.2.2 (JDQ39) 重现了你的逻辑;图片尺寸 1280x960 相机都没有问题。请注意,图片方向并不完全是人们所期望的,但您的问题并没有提到摆弄相机方向。

于 2013-05-20T19:25:17.017 回答