安卓相机支持的图片尺寸

14

我正在尝试检索可用的相机图像大小,以便我能够将相机调整到我的首选图像分辨率。

为了检索Android相机的大小,我使用了以下代码:

camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
for (int i=0;i<sizes.size();i++){
    Log.i("PictureSize", "Supported Size: " +sizes.get(i));         
}
这给我以下输出,但我不确定如何将其转换为大小。
"Supported size: android.hardware.Camera$Size@65d4c50"
"Supported size: android.hardware.Camera$Size@65d4a70"
"Supported size: android.hardware.Camera$Size@3fe4e00"
"Supported size: android.hardware.Camera$Size@3fe4cd0"
"Supported size: android.hardware.Camera$Size@18f5600"
"Supported size: android.hardware.Camera$Size@13f7860"

如果有人能帮助我理解输出结果,那将对我非常有帮助,谢谢!

编辑:最终我通过以下方式解决了我的问题:

camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
Camera.Size result = null;
    for (int i=0;i<sizes.size();i++){
        result = (Size) sizes.get(i);
        Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height); 
    }
4个回答

13

getSupportedPictureSizes()方法返回一个List对象,其中包含了许多Camera.Size对象。每个Camera.Size对象都有自己的heightwidth数据成员,这些成员可以告诉你所支持的图片尺寸的高度和宽度。

这里是一个示例项目,它使用相关的getSupportedPreviewSizes()方法来查找最大面积且小于SurfaceView大小的预览尺寸。


1
谢谢,现在我的问题解决了。不知何故我错过了通过调用getSupportedPictureSizes()获取Camera.Size对象的方法。这个示例项目非常好。 - Lasse Samson
CommonsWare,在您的项目中,您并未设置图片大小 - 我想知道是否有必要设置图片大小呢?因为在支持各种不同设备并保持预览和图片大小同步的过程中,它给我带来了严重的麻烦,并且不会让它们由于长宽比而变得太小。 - AgentKnopf
@Zainodis:“在你的项目中,你没有设置图片大小”--那个样本不拍摄照片。它只是设置预览。 “有必要设置图片大小吗?”--可能有默认值,但我总是设置一下。 “因为如果不考虑宽高比,支持各种不同的设备并保持预览和图片大小同步而不让它们变得太小,这会给我带来严重的麻烦。” --我感同身受,因为我在我的CWAC-Camera助手库中也遇到了一些问题。 - CommonsWare
@CommonsWare 谢谢您的回答 :) 我担心没有简单的解决方案。似乎相机处理是 Android 的(其中之一)圣杯 xD。 - AgentKnopf

5
Camera camera = Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
for (int i=0;i<sizes.size();i++) {
    Log.i("PictureSize", "Supported Size: " +sizes.get(i).width + "height : " + sizes.get(i).height);     
}   

你必须从一个尺寸对象中获取高度和宽度。


我无法以那种方式使其正常工作。最终我采用了以下方法:声明一个相机大小变量,然后使用它来容纳每个对象,并从中获取宽度/高度。不太确定为什么我不能像你建议的那样实现它。 - Lasse Samson
@krishnabhadra 我想知道 List sizes 的第一个元素 (sizes.get(0)) 是否是相机给出的最佳图片尺寸?还是仅仅是相机给出的随机好的图片尺寸? - Peter Zhu

2

这里是一个示例,展示如何搜索接近您的最大尺寸(例如1024 * 768)的大小。

                List<Camera.Size> sizes = parameters.getSupportedPictureSizes();
                //searches for good picture quality
                Camera.Size bestDimens = null;
                for(Camera.Size dimens : sizes){
                    if(dimens.width  <= 1024 && dimens.height <= 768){
                        if (bestDimens == null || (dimens.width > bestDimens.width && dimens.height > bestDimens.height)) {
                            bestDimens = dimens;
                        }
                    }
                }
                parameters.setPictureSize(bestDimens.width, bestDimens.height);
                camera.setParameters(parameters);

0
这是我最终采取的方法。由于方法params.getSupportedPictureSizes()返回类型为Camera.Size的列表,因此很容易实现:
        List<Camera.Size> sizes = p.getSupportedPictureSizes();

        //searches for good picture quality
        for(Camera.Size dimens : sizes){
            if(dimens.width  <= 1024 && dimens.height <= 768){
                Debug.WriteLine("Width: " + dimens.width + " Height: " + dimens.height);
                return dimens;
            }
        }

        Debug.WriteLine("Width: " + sizes.get(sizes.size()-1).width + " Height: " + sizes.get(sizes.size()-1).height);
        //returns the smallest camera size if worst comes to worst
        return p.getSupportedPictureSizes().get(sizes.size()-1);

您可以获取一个List<Camera.Size>并像任何其他列表一样遍历它。 Camera.Size对象具有widthheight属性。

以这种方式声明您的List可能比在循环内将列表的每个元素强制转换为Camera.Size类型更好。

在我的设备上,如果我查看sizes.get(0),它将具有最高分辨率,而sizes.get(sizes.size()-1)则具有最低分辨率。但是,我不确定这是否适用于所有设备。 有人对此有了解吗?


1
在我的三星Galaxy Note II上,最小的尺寸是索引0,向上增加。因此,在所有设备上都不相同。 - Oliver Hausler
是的,三星手机在相机方面确实很难处理。还有其他问题,比如图像被翻转(没有exif接口)。我见过人们尝试检测设备是否为三星设备,并根据此运行函数。真是太痛苦了,对吧? - Nlinscott
是的,这一切都非常令人难过。特别是编写驱动程序应该是操作系统的一部分。 - Oliver Hausler

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