5

我的应用程序使用表面支架打开相机。相机以默认预览大小打开。在某些设备上,默认预览大小捕获的图像多于屏幕上实际可见的图像。为了避免这种情况,我开始自己设置预览大小。标准是从可用尺寸列表中选择最接近屏幕宽度的预览尺寸。

这在大多数情况下都很有效。但我经常偶然发现一些不喜欢我选择的预览尺寸的设备。

1) Nexus 4 没有为我选择的其中一种预览尺寸捕获图像。2) 三星 S 4 沿捕获的图像给出一条线(噪声)。

所以我想了解我是否在做任何违反标准的事情。这是我的问题:-

1)我正在使用表面支架打开相机。有没有其他方法可以在我的应用程序中使用相机硬件。

2) 我正在从可用尺寸列表中选择预览尺寸。在选择任何尺寸之前我应该​​寻找任何具体的东西吗?选择尺寸的逻辑如下:-

private Camera.Size getBestPreviewSize(int width, int height)
    {
        List<Size> sizes = camera.getParameters().getSupportedPreviewSizes();
        if (sizes == null) return null;

        Size optimalSize = null;
        double minDiff = Double.MAX_VALUE;

        int targetHeight = height;
        int targetWidth = width;

        int minWidthDiff = 0;
        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.width - targetWidth) < minDiff) {
                    if(size.width > width) {
                        if (minWidthDiff == 0) {
                            minWidthDiff = size.width - width;
                            optimalSize = size;
                        }
                        else if (Math.abs(size.width - targetWidth) < minWidthDiff) {
                            minWidthDiff = size.width - width;
                            optimalSize = size;

                        }   
                        minDiff = Math.abs(size.width - targetWidth);
                     }
                }
            }
        }

        if (optimalSize == null) {
            minDiff = Double.MAX_VALUE;
            for (Size size : sizes) {
                if (Math.abs(size.height - targetHeight) < minDiff) {
                    optimalSize = size;
                    minDiff = Math.abs(size.height - targetHeight);
                }
            }
        }
        return optimalSize;
    }

任何有关这方面的指示都会有帮助。

谢谢 !!加根

4

1 回答 1

10

使用相机时,您需要考虑几个不同的尺寸:

传感器尺寸 相机具有由硬件决定的原始分辨率和纵横比。

图片尺寸 这是当您告诉相机拍照时产生的图像尺寸。如果它与原始分辨率的纵横比相同,那么它将直接从该分辨率缩放。如果纵横比不同,则将从原始尺寸裁剪。根据我的经验,返回的最大尺寸getSupportedPictureSizes是相机的原始分辨率。

预览大小这是屏幕上显示 的图像预览的大小。它可能与原始大小或图片大小的纵横比不同,从而导致进一步裁剪。

要使您在屏幕上看到的内容与拍摄照片时生成的图像最接近,请尝试选择纵横比与您选择的图片大小的纵横比尽可能接近的预览尺寸。我通常会尽量让两者都接近原生尺寸。

于 2013-10-08T22:32:24.290 回答