2012-07-09 103 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();