2012-07-09 78 views
2

在我的应用程序中,我使用ACTION_IMAGE_CAPTURE意图来拍摄照片。当相机返回时,文件被选中,如果旋转为纵向一个位图旋转并保存到磁盘上用下面的代码:已保存的JPEG是旋转后从磁盘加载的JPEG的两倍大

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,将比例设置为假,但都没有达到预期的效果。我希望我转换的图像与我从磁盘加载的图像大小相同。我的代码中是否有防止这种情况发生的东西?

回答

7

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

+0

相当不错的描述如何计算大小;)实际上已经错过了。 – Warpzit 2012-07-09 13:55:10

+0

谢谢你的回复。我添加了一行代码,应该将旋转后的位图转换为适当的像素格式,但问题依然存在。任何其他想法?我认为在设置BitmapFactory.Options – redwoolf 2012-07-09 14:17:19

+0

上的RGB_565时考虑了像素格式。我不确定Android如何处理像这样的位图格式。您更改的行可能不会影响位图如何输出(重新压缩)到新文件。 – MusiGenesis 2012-07-09 14:21:50

1

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

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

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();