1

我的相机有一个 3264x1952 的 JPEG。该文件大约 1.7 兆字节。

我想知道是否可以在更改分辨率的情况下将此图像压缩为较小的文件大小。即我希望我的结果图像也是 3264x1952。

如果不使用 inSampleSize 选项缩小图像,我什至无法将此 JPEG 作为位图打开。

有人知道我的选择是什么吗?有什么方法可以减少颜色位深度/增加压缩/降低质量?

编辑:我正在专门寻找适用于 Android 的解决方案。主要问题是我无法打开完整的 res JPEG 而不会遇到 OOM 错误,所以我不知道如何继续。

理想情况下,我想做:

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);

但是当我这样做时应用程序会崩溃:

Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
4

3 回答 3

1

您可以使用将对象BitmapFactory.decodeFile作为第二个参数BitmapFactory.Options并用于inSampleSize缩放图像的方法。例如 aninSampleSize = 2将产生 和 的输出width/2图像height/2,。请记住,您的位图始终需要width x heigth x 4字节的内存

于 2013-06-26T07:21:57.043 回答
0

您需要缩小图像。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

使用适当Bitmap.decode的方法并缩小图像。

位图解码

例子 :

使用所需参数调用该方法。

public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){
 try {
     //Decode image size
     BitmapFactory.Options o = new BitmapFactory.Options();
     o.inJustDecodeBounds = true;
     BitmapFactory.decodeStream(new FileInputStream(f),null,o);

     //The new size we want to scale to
     final int REQUIRED_WIDTH=WIDTH;
     final int REQUIRED_HIGHT=HIGHT;
     //Find the correct scale value. It should be the power of 2.
     int scale=1;
     while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
         scale*=2;

     //Decode with inSampleSize
     BitmapFactory.Options o2 = new BitmapFactory.Options();
     o2.inSampleSize=scale;
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
 } catch (FileNotFoundException e) {}
 return null;
}
于 2013-06-26T07:33:33.180 回答
0

我认为您想使用BitmapFactory.decodeStream,从 JPEG 文件中获取流。您可以在返回位图之前修改密度。

于 2013-06-26T07:19:14.253 回答