安卓:拍摄的照片比预览图大

16

我正在尝试使用相机API直接捕获照片,但这是我得到的预览图: 在此输入图片描述

& 在调用takePicture()后拍摄的照片要比预览本身大:

在此输入图片描述

(注意:我裁剪了前两张照片的高度以增强问题的可读性,并保持宽度不变)

在开始相机预览之前,我使用这个实用方法来选择最佳的预览大小:

public static Camera.Size getBestAspectPreviewSize(int displayOrientation,
                                                   int width,
                                                   int height,
                                                   Camera.Parameters parameters) {
    double targetRatio = (double) width / height;
    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;
    if (displayOrientation == 90 || displayOrientation == 270) {
        targetRatio = (double) height / width;
    }
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    Collections.sort(sizes,
            Collections.reverseOrder(new SizeComparator()));
    for (Camera.Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(ratio - targetRatio);
        }
        if (minDiff < 0.0d) {
            break;
        }
    }
    return (optimalSize);
}

& 选择适合的图片尺寸的方法:

public static Camera.Size getBiggestSafePictureSize(Camera.Parameters parameters) {
    Camera.Size result = null;
    long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    long availableMemory = Runtime.getRuntime().maxMemory() - used;
    for (Camera.Size size : parameters.getSupportedPictureSizes()) {
        int newArea = size.width * size.height;
        long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :) )
        if (neededMemory > availableMemory)
            continue;
        if (result == null) {
            result = size;
        } else {
            int resultArea = result.width * result.height;
            if (newArea > resultArea) {
                result = size;
            }
        }
    }
    return (result);
}

& 这是布局中的相机预览元素:

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/cameraPreview"></FrameLayout>

& 我遵循官方文档来创建相机预览本身

那么,如何强制相机预览显示将要拍摄的确切照片?

2个回答

23

终于找到了它 :)

按照这个答案的说法,我引用:

虽然典型的相机是4:3的长宽比,但预览也可能以5:3和16:9的比例提供,似乎是通过实际扩展水平视野来实现的...

因此,我们需要找到具有4:3长宽比的预览尺寸和图片尺寸,以利用相机的全角度,所以我将我的代码更改为:

public static Camera.Size determineBestPreviewSize(Camera.Parameters parameters) {
    List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
    return determineBestSize(sizes);
}

public static Camera.Size determineBestPictureSize(Camera.Parameters parameters) {
    List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
    return determineBestSize(sizes);
}

protected static Camera.Size determineBestSize(List<Camera.Size> sizes) {
    Camera.Size bestSize = null;
    long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    long availableMemory = Runtime.getRuntime().maxMemory() - used;
    for (Camera.Size currentSize : sizes) {
        int newArea = currentSize.width * currentSize.height;
        long neededMemory = newArea * 4 * 4; // newArea * 4 Bytes/pixel * 4 needed copies of the bitmap (for safety :) )
        boolean isDesiredRatio = (currentSize.width / 4) == (currentSize.height / 3);
        boolean isBetterSize = (bestSize == null || currentSize.width > bestSize.width);
        boolean isSafe = neededMemory < availableMemory;
        if (isDesiredRatio && isBetterSize && isSafe) {
            bestSize = currentSize;
        }
    }
    if (bestSize == null) {
        return sizes.get(0);
    }
    return bestSize;
}

1
这里似乎有非常珍贵的信息! - Fattie

2

应该对parameters.getSupportedPictureSizes()返回的不同尺寸运行相同的循环,而不是依赖于默认的图片尺寸。此外,我更希望寻找最佳的预览/图片尺寸对,并在屏幕上裁剪图片,如果该宽高比与cameraPreview布局的宽高比不匹配。


你的设备有哪些尺寸?它们的纵横比相同吗? - Alex Cohn
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - AbdelHady
但是,正如我告诉你的那样,当我在同样的两个设备上打开Instagram时,它会以更大的摄像头角度打开,并显示一个预览,就像我的应用程序拍摄的照片一样,所以问题出在我的预览上! - AbdelHady
好的,我已经尝试了一个具有相同宽高比的图片大小,但仍然得到相同的结果。 - AbdelHady
1
请选择预览大小以适应 4:3,而不是相反。 - Alex Cohn
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接