13

设备 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

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

Surface view (1280,720) -> Perfect image

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

在我漫长的搜索中,我发现了另外 1 篇也与此问题相关的帖子,但不是答案,只是我的问题 PictureCallback not called 的更多证据, 除非使用supportedsizes [0]

谢谢

4

3 回答 3

7

在 Nexus 4 上,存在一个不幸的问题,即预览纵横比和静态图片纵横比捆绑在一起,即使您从不拍照。如果它们不匹配,则两者之一会失真(通常是预览,因为它是较低的分辨率)。

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

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

于 2013-06-25T18:57:25.200 回答
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;

    }
}
于 2013-06-25T15:31:59.193 回答
0

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

于 2013-04-12T13:14:56.143 回答