保存的JPEG是旋转后从磁盘加载的JPEG的两倍

时间:2012-07-09 13:47:11

标签: android

在我的应用程序中,我使用ACTION_IMAGE_CAPTURE Intent来拍照。当相机返回时,将检查文件,如果旋转是纵向,则使用以下代码旋转位图并将其保存到磁盘:

BitmapFactory.Options options = new Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bmp = BitmapFactory.decodeFile(f.getAbsolutePath(), options);
if (bmp != null) {
    Matrix m = new Matrix();
    m.postRotate(90);
    Bitmap rotated = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), m,
                                        true);
    rotated = rotated.copy(Bitmap.Config.RGB_565, false); // added based on comment
    f.delete();
    FileOutputStream fos = new FileOutputStream(f);
    rotated.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.close();
}

这样可以正常工作,但文件大小是非旋转图片的两倍。我已经尝试将BitmapFactory.Options上的密度设置为0并将比例设置为false,但两者都没有达到预期的效果。我希望我转换的图像大小与从磁盘加载的图像大小相同。我的代码中是否存在阻止这种情况发生的事情?

3 个答案:

答案 0 :(得分:7)

您的原始JPEG使用RGB565,每个像素使用2个字节。从此文件派生的内存中位图使用“普通”格式,每个像素4个字节;当它被保存为新的JPEG时,它以更密集的格式保存,因此是两倍大小(这与它的旋转无关)。

答案 1 :(得分:1)

这可能是因为您在转换为JPEG时不允许任何有损压缩。尝试将质量设置为90或80,这应该会显着减小文件大小。

不要被“有损”这个词吓到。这是JPEG的一个重要部分,这就是它获得压缩水平的原因,但是人眼看不到损失。

答案 2 :(得分:1)

您可以使用ExifInterface旋转JPEG图像,而无需实际解码并重新压缩像素。例如:

ExifInterface exif = new ExifInterface(filename);
int old_orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
int new_orientation = ...; // implement your business logic here
exif.setAttribute(TAG_ORIENTATION, new_orientation);
exif.saveAttributes();