Android 相机支持的图片尺寸
Posted
技术标签:
【中文标题】Android 相机支持的图片尺寸【英文标题】:Android camera supported picture sizes 【发布时间】:2011-12-21 01:47:13 【问题描述】:我正在尝试检索可用的相机图像尺寸,以便将相机调整为我喜欢的图像分辨率。
为了检索 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);
【问题讨论】:
【参考方案1】:getSupportedPictureSizes()
返回 List
的 Camera.Size
对象。 Camera.Size
具有 height
和 width
数据成员,它们告诉您支持的图片大小的高度和宽度。
Here is a sample project 使用相关的getSupportedPreviewSizes()
查找最大区域小于SurfaceView
大小的预览大小。
【讨论】:
谢谢现在解决了我的问题。不知何故,我错过了通过调用 getSupportedPictureSizes() 来获取 Camera.Size 对象。示例项目很棒。 CommonsWare,在您的项目中,您没有设置图片大小 - 我想知道是否有必要设置图片大小?因为它给我带来了严重的麻烦,支持各种不同的设备并保持预览和图片大小同步,并且不让它们由于纵横比而变得太小。 @Zainodis:“在你的项目中,你没有设置图片大小”——那个特定的样本没有拍照。它只设置预览。 “有必要设置我想知道的图片大小吗?” -- 可能有默认值,但我总是设置一个。 “因为它给我带来了严重的麻烦,支持各种不同的设备并保持预览和图片大小同步,并且不让它们由于纵横比而变得太小”——当我处理其中一些时,我感到你的痛苦在我的 CWAC-Camera 辅助库中。 @CommonsWare 感谢您的回答:) 我担心不会有一个简单的解决方案。似乎相机处理是 Android xD 的圣杯之一。【参考方案2】: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);
您必须从一个尺寸的对象中获取高度和宽度
【讨论】:
我无法让它以这种方式工作。我最终改为执行以下操作:声明一个相机大小变量,然后用它来保存每个对象并从中获取宽度/高度。不太清楚为什么我不能像你建议的那样实现它。 @krishnabhadra 我想知道列表尺寸的第一个元素(sizes.get(0))是否是相机给出的最佳图片尺寸?或者只是一个随机的好图片大小的相机?【参考方案3】:这是一个示例,说明如何搜索接近您的最大尺寸 (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);
【讨论】:
【参考方案4】:这就是我最终要做的。由于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
对象具有 width
和 height
属性。
以这种方式声明您的 List
可能比将列表的每个元素强制转换为在循环内键入 Camera.Size
更好。
在我的设备上,如果我查看sizes.get(0)
,它的分辨率最高,而sizes.get( sizes.size()-1 )
的分辨率最低。但是,我不确定这是否适用于所有设备。有人对此有见解吗?
【讨论】:
在我的三星 Galaxy Note II 上,最小的尺寸是索引 0,向上。所以它在所有设备上并不相同。 是的,三星手机在相机方面很难使用。还有其他问题,例如图像被翻转(没有 exif 接口)。我见过人们试图检测设备是否是三星设备并基于它运行功能。多么痛苦,我说得对吗? 是的,这一切都非常可悲。尤其是编写驱动程序应该是操作系统的一部分。以上是关于Android 相机支持的图片尺寸的主要内容,如果未能解决你的问题,请参考以下文章