2

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

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,但都没有达到预期的效果。我希望我转换的图像与我从磁盘加载的图像大小相同。我的代码中有什么东西可以防止这种情况发生吗?

4

3 回答 3

7

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

于 2012-07-09T13:52:34.547 回答
1

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

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();
于 2012-07-09T14:02:26.193 回答
1

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

不要被“有损”这个词吓到。这是 JPEG 的重要组成部分,这就是为什么它获得了它所做的压缩级别,但损失对人眼来说并不那么明显。

于 2012-07-09T13:51:26.530 回答