2017-10-13 150 views
-1

目標:我想發送所拍攝的圖像文件服務器,在代碼中,我可以通過改造發送photoFile到服務器上,但圖像是在服務器端的轉動,所以我的目標是觀察旋轉,旋轉回到真實狀態並將該文件發佈到服務器。的OutOfMemoryError錯誤而旋轉的位圖

問題:我從凸輪捕捉圖像,然後觀察它的旋轉,並基於此旋轉,但它在創建第二個旋轉的位圖時發生內存不足錯誤。

問題:我正在尋找解決方案,我可以在不創建位圖的情況下將其發送到服務器,如果沒有,避免發生內存異常並將正確旋轉的文件發送到服務器。

 else if (requestCode == CAPTURE_IMAGE) { 
      ExifInterface exifInterface = new ExifInterface(photoFile.getAbsolutePath()); 
      Bitmap bitmapOrg = BitmapFactory.decodeFile(photoFile.getAbsolutePath(), new BitmapFactory.Options()); 
      Matrix matrix = new Matrix(); 

      //getRotation method rightly gives 90 as rotation. 
      matrix.postRotate(getRotation(exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
            ExifInterface.ORIENTATION_NORMAL))); 

      //point of outofmemory error while creating this bitmap 
      Bitmap rotated = Bitmap.createBitmap(bitmapOrg, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
      Log.d(TAG, "onActivityResult: "); 
     } 
+0

你不需要創建位圖。使用ExifInterface在文件中設置正確的旋轉。閱讀exif。將旋轉設置爲想要的。寫exif回來。 – greenapps

回答

1

它給內存不足的錯誤,同時創造第二旋轉位圖

您可能沒有免費的系統內存在一個單一的全分辨率照片加載,更何況他們兩個。您的主要選擇是:

  • 不加載全分辨率照片。相反,選擇較小的分辨率,使用BitmapFactory.OptionsinSampleSize可以在加載Android時縮小圖像的大小。這並不能保證它可以正常工作,因爲堆可能相當分散,但它增加了它的工作可能性。

  • 做旋轉的服務器,你有很多的RAM,大量的CPU時間等

  • 裝入照片上,做旋轉的C/C++代碼,採用的是Android NDK,如原生分配(例如,malloc())不計入您的堆限制。

  • 在您的<application>的清單中使用android:largeHeap="true"。在某些設備上,這將爲您提供更大的工作空間。不能保證你會得到一個更大的堆,即使堆更大,你仍然可能用完內存。

我找的解決方案,我可以旋轉,並將其發送到服務器,而無需創建位圖

中沒有任何的Android爲,對不起。

+0

是否可以在創建'rotateBitamp'之前清除'bitmapOrg',這樣我就可以使用更多空間了? –

+0

@AalapPatel:不,因爲那時你沒有什麼可以旋轉的。 – CommonsWare

+0

嘗試使用inSamplesize 2的第一個想法,它似乎工作,我仍然必須創建位圖,然後文件,然後將該文件發佈到服務器,我不認爲有另一種方式發送旋轉的文件與創建位圖.. –

0

我知道你有一段旋轉位圖所以這裏是我在大多數我的項目使用的幫手,讓我知道如果它解決您的問題:

public static Bitmap getRotatedBitmap(Bitmap bm, float degree) { 
     Bitmap bitmap = bm; 
     if (degree != 0) { 
      Matrix matrix = new Matrix(); 
      matrix.preRotate(degree); 
//   if(shouldFlip) 
//    matrix.preScale(-1,1); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), matrix, true); 
     } 

     return bitmap; 
    } 
+0

這正是我在做什麼,它給旋轉位圖創建outofmemory錯誤 –