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

2019-08-17 12:55发布

设备的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()我得到正确的一个,我设置的,但如果....我把我的面以相同的大小作为我的摄像头预览然后我得到一个拉伸图片。 例如

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

只有当我把我的面以16:9(1.77777),我会得到一个完美的形象。

Surface view (1280,720) -> Perfect image

这是我对这个问题的唯一设备。 请某人告知,如果有一个摄像头设置我失踪了全屏模式,或从工作停止这个事情。

在我漫长的寻找,我发现其他1杆,它也涉及到这个问题,但不是一个答案,只是我的问题有点多的证据PictureCallback不叫,除非使用supportedsizes [0]

谢谢

Answer 1:

在的Nexus 4,有一个不幸的问题,即预览宽高比和静止图像的宽高比被连接在一起,即使你从来没有拍摄照片。 如果它们不匹配,两个中的一个被扭曲(通常预览,因为它是分辨率较低)。

如果你想使用4:3的预览,配置静态图片的大小为4:3为好,开始预览之前。 例如,640×480的预览与N4全8MP画面尺寸(3264 X 2448)应导致没有拉伸为预览。

使用Camera.Parameters.setPictureSize选择图像大小; 可用尺寸的列表中,可以读出Camera.Parameters.getSupportedPictureSizes 。



Answer 2:

这种方法计算每个设备的最佳(我)的屏幕尺寸。 但是,我有一个像你一样的问题,当我试图在的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;

    }
}


Answer 3:

请尝试设置surfaceview的基础上,你正在使用的相机参数的比例大小。



文章来源: Nexus 4 Camera preview aspect Ratio always requires 16x9 surfaceview? Why