2012-08-09 81 views
5

我看過很多文章嗎?但我找不到正確的答案。如何從「onPictureTaken」旋轉圖片而不會出現內存不足異常?

我嘗試做一些這樣的:

@Override 
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera) { 
    try { 


     Bitmap bitmap = BitmapFactory.decodeByteArray(paramArrayOfByte, 0, 
     paramArrayOfByte.length); 

     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 

     FileOutputStream os = new ileOutputStream(Singleton.mPushFilePath); 

     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, 
      height, matrix, false); 

     resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, os); 
     os.close(); 
     ... 

有沒有辦法可以旋轉圖片,而無需使用BitmapFactory?我想旋轉圖片而不損失質量!

+0

這裏有一個很好的解決方案:http://stackoverflow.com/questions/2225363/c-sharp-rotate-bitmap-90-degrees – paul 2012-08-09 12:46:19

+0

這是偉大的,但它的C#? – 2012-08-09 12:50:34

+0

對不起 - 沒有閱讀標籤! – paul 2012-08-09 13:00:37

回答

4

也許你可以用你想使用Camera.setDisplayOrientation旋轉的圖像?檢查Android camera rotate。此外,調查Camera.Parameters.setRotation()。其中一種技巧應該爲你做好準備。

否則你的代碼看起來很好,除了在Bitmap.compress上使用參數95,你需要使用100來進行無損壓縮。

要避免內存不足異常,請使用Camera.Parameters.setPictureSize()獲取較低分辨率的圖片(例如3Mpx)。即你真的需要一張8Mpx的照片嗎?確保使用Camera.Parameters.getSupportedPictureSizes()來確定設備上支持的尺寸。

+5

不幸的是,'setDisplayOrientaion()'僅適用於預覽,並且不影響在'onPicturetaken()'中捕獲的緩衝區。有關實際解決方案,請參閱http://stackoverflow.com/a/18447809/192373 – 2014-04-05 13:07:24

+2

setRotation就是這樣做的 - 旋轉您在onPictureTaken中收到的實際圖像。 – slott 2015-05-19 06:38:14