Nexus 4相机预览宽高比率总是需要16x9的surfaceview?为什么

时间:2013-03-12 12:47:36

标签: android camera preview aspect-ratio nexus-4

Device Nexus 4 Android版本:4.2.2

希望其他人找到这个,并解释如何解决它......

Nexus 4支持以下预览尺寸: -

W:1280 H:720 Ratio: 1.777777
W:800 H:480 Ratio: 1.6666666
W:768 H:432 Ratio: 1.7777778
W:720 H:480 Ratio: 1.5
W:640 H:480 Ratio: 1.3333334
W:576 H:432 Ratio: 1.3333334
W:480 H:320 Ratio: 1.5
W:384 H:288 Ratio: 1.3333334
W:352 H:288 Ratio: 1.2222222
W:320 H:240 Ratio: 1.3333334
W:240 H:160 Ratio: 1.5
W:176 H:144 Ratio: 1.2222222

myCamera.setPreviewSize()设置它们,当我调用myCamera.getPreviewSize()时,我得到了我设置的正确的,但是......如果我将表面视图设置为与我的相机预览相同的尺寸,那么我获得一个拉伸的图像。 e.g。

setPreviewSize(640,480)
getPreviewSize -> I get 640,480
Surface view (640,480) -> Stretched image

只有将Surface视图设置为16x9(1.77777)才能获得完美的图像。

Surface view (1280,720) -> Perfect image

这是我遇到此问题的唯一设备。请有人建议我是否有相机设置我缺少全屏模式或者是阻止它工作的东西。

在我长时间的搜索中,我发现了另外一篇与此问题相关的帖子,但不是答案,只是我的问题的更多证据 PictureCallback not called unless using supportedsizes[0]

谢谢

3 个答案:

答案 0 :(得分:7)

在Nexus 4上,即使您从不拍照,也会出现一个令人遗憾的问题,即预览宽高比和静态图片宽高比紧密相连。如果它们不匹配,则两个中的一个变形(通常是预览,因为它是较低的分辨率)。

如果要使用4:3预览,请在开始预览之前将静态图片大小配置为4:3。例如,在N4上使用完整的8MP图像尺寸(3264 x 2448)进行640x480预览会导致无预览拉伸。

使用Camera.Parameters.setPictureSize选择图片尺寸;可以从Camera.Parameters.getSupportedPictureSizes中读取可用尺寸列表。

答案 1 :(得分:3)

此方法计算每个设备的最佳(对我而言)屏幕大小。但是,当我在Nexus 4中尝试这个代码时,我遇到了和你一样的问题。所以,我的解决方案是在这个方法的最后有一个特殊情况,它获取nexus 4的宽度并为此计算最佳高度设备。

最后一种情况可以在所有设备中使用。您可以删除方法的第一部分。

private void setAspectResolutionCamera(Parameters camParams, int screen_width, int screen_height) {
    boolean chosen_one_resolution = false;

    //Init screen sizes
    width_video = ConstantsCamera.VIDEO_ASPECT_WIDTH;
    height_video = ConstantsCamera.VIDEO_ASPECT_HEIGHT;

    float aspect_ratio = 1f;
    int aspect_width = 6000, aspect_height = 6000;
    List<Size> supported_sizes_list = camParams.getSupportedPreviewSizes();
    for (int i = 0; i < supported_sizes_list.size(); i++) {
        Size size = supported_sizes_list.get(i);

        float aspect = (float) size.height / size.width;
        if (ConstantsCamera.VIDEO_ASPECT_RATIO - aspect <= aspect_ratio && (aspect - ConstantsCamera.VIDEO_ASPECT_RATIO >= 0)) {

            if (screen_width - size.height <= aspect_width && size.height - screen_width >= 0) {

                if (screen_height - size.width < aspect_height) {
                    height_video = size.width;
                    width_video = size.height;
                    aspect_ratio = ConstantsCamera.VIDEO_ASPECT_RATIO - (float) size.height / size.width;
                    aspect_width = screen_width - size.height;
                    aspect_height = screen_height - size.width;

                    chosen_one_resolution = true;


                }
            }
        }
    }

    //Special case
    if (width_video != screen_width && !chosen_one_resolution) {
        height_video = screen_width * height_video / width_video;
        width_video = screen_width;

    }
}

答案 2 :(得分:0)

尝试根据您正在使用的相机参数的比例设置表面视图的大小。