Android摄像头预览尺寸问题

Android摄像头预览尺寸问题,android,camera,size,preview,Android,Camera,Size,Preview,我的应用程序使用surface holder打开相机。摄影机将以默认预览大小打开。在某些设备上,默认预览大小捕获的图像比屏幕上实际可见的图像多。为了避免这种情况,我开始自己设置预览大小。标准是从可用的尺寸列表中选择预览尺寸,该尺寸最接近屏幕宽度 这在大多数情况下都很有效。但我经常会偶然发现一些设备不喜欢我选择的预览大小 1) Nexus 4没有为我选择的预览尺寸之一捕获图像。 2) 三星S 4提供了沿拍摄图像的线条(噪声)带 所以我想知道我是否做了违反标准的事情。以下是我的问题: 1) 我正在使

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

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

1) Nexus 4没有为我选择的预览尺寸之一捕获图像。 2) 三星S 4提供了沿拍摄图像的线条(噪声)带

所以我想知道我是否做了违反标准的事情。以下是我的问题:

1) 我正在使用surface holder打开相机。是否有其他方法可以在我的应用程序中使用摄像头硬件

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;
    }
private Camera.Size getBestPreviewSize(整数宽度,整数高度)
{
列表大小=camera.getParameters().getSupportedPreviewSizes();
如果(size==null)返回null;
Size=null;
double minDiff=double.MAX_值;
int targetHeight=高度;
int targetWidth=宽度;
int minWidthDiff=0;
如果(optimalSize==null){
minDiff=Double.MAX_值;
用于(尺寸:尺寸){
if(数学绝对值(尺寸宽度-目标宽度)width){
如果(minWidthDiff==0){
minWidthDiff=size.width-宽度;
尺寸=尺寸;
}
else if(Math.abs(size.width-targetWidth)
这方面的任何指导都会很有帮助

谢谢!!
Gagan

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

传感器尺寸 相机的本机分辨率和纵横比由硬件决定

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

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

要在屏幕上看到的内容与拍照时生成的图像之间获得最接近的匹配,请尝试选择宽高比尽可能接近所选图片大小宽高比的预览大小。我通常会尽量使两者都接近本地尺寸