如何压缩相机拍摄的照片(Camera.takePicture)?

3

我正在开发一个应用程序,用户可以通过我的CameraActivity(SurfaceView+相机)拍照并保存。之后将处理位图。

说了这么多,让我为您详细介绍一下。图片是使用以下方式拍摄的:

mCamera.takePicture(null, null, new PictureCallback() {...}

我没有指定.jpeg的质量。
在HTC One S上测试,照片被拍摄并保存。照片大小从未超过100kb。
在三星GT-I9000上测试,照片被拍摄并保存,但区别在于大小,它超过了1.2Mb。

由于我之后需要处理位图,因此在尝试解码位图以进行处理时,GT-I9000出现了一些内存不足问题:

try {
    FileInputStream fis = new FileInputStream(new File(imagePath));
    Bitmap savedPicture = BitmapFactory.decodeStream(fis);

我尝试更改Camera Parameters .setJpegQuality(quality),但是并没有产生很大的差异。
图像将占用整个屏幕大小,我使用了这种方法高效加载大型位图。它奏效了,我摆脱了OutOfMemory Exceptions,但我仍有一些问题:
  1. 设备之间的文件大小差异?我认为HTC One S比GT-I9000更好,那么为什么不保存更大的图片呢?

  2. 图像分辨率,HTC One S 640x480,GT-I9000 2560x1920为什么?好吧,这回答了第一个问题,但为什么会发生这种情况呢?

感谢您的时间;)
1个回答

5
你的问题不在于图像压缩,而在于分辨率,即大小。不同的Android设备具有不同的默认图片大小。但是幸运的是,你可以使用Camera.Parameters.setPictureSize(int width, int height)方法。你可以在调用Camera.takePicture()之前随时设置大小,如下所示:
Camera.Parameters param = mCamera.getParameters();
param.setPictureSize(640, 480);
mCamera.setParameters(param);

请注意,不同的Android设备也支持不同的图片尺寸。即,您不能设置任意大小,必须从设备特定的列表中选择一个尺寸。有一种方法Camera.Parameters.getSupportedPictureSizes()。
请注意,对于两个摄像头(如果该设备具有前置摄像头和后置摄像头),同一设备上支持的图片尺寸是不同的。在开始查询和设置之前,请打开正确的相机。
最后,我应该承认,我所听说的所有设备都支持640x480的图片尺寸。

1
@yozawiratama:如果您开一个新话题并准确描述您的需求,您可能会得到更多的回应。无论如何,这是我第一次听到 CameraHelper 这个名字,因此我的帮助能力有些有限。 - Alex Cohn
1
@AlexCohn 谢谢 Alex,我终于尝试使用了你的解决方案 :D ,感谢你的解决方案。 - yozawiratama
param.setPictureSize(640, 480); 如果我使用 param.setPictureSize(480, 360); 它不起作用... 你能告诉我为什么吗? - Meghna
@MycareerId:你的相机不支持480x360。你可以检查params.getSupportedPictureSizes()返回的列表,或者在http://androidfragmentation.com的数据库中搜索你的设备。 - Alex Cohn
谢谢,我已经得到了另一个解决方案,但我也会尝试您的解决方案。 - Meghna
显示剩余3条评论

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