2012-07-08 40 views
13

我的代碼的代碼是:MediaStore.Images.Media.getBitmap和內存不足的錯誤

public Bitmap loadPhoto(Uri uri) { 
    Bitmap scaled = null; 
    try { 
    scalled = Bitmap.createBitmap(
     MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 
     0,0,90, 90); 

    if (scaled == null) { return null; } 
    } catch(Exception e) { } 
    return scaled; 
} 

在此之後。我在ImageView中縮放顯示。每個圖像都來自設備相機。

每當我從相機顯示三張照片後,我都會收到內存不足的內存錯誤。如何解決這個問題?

+1

我有同樣的問題,看看這個鏈接: [http://tutorials-android.blogspot.co.il/2011/11/ outofmemory-exception-when-decoding.html](http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception-when-decoding.html) – zwebie 2012-08-02 13:25:25

+1

另請參閱Chet Haase關於位圖縮放的不錯教程: http://www.youtube.com/watch?v=12cB7gnL6po – 2013-04-25 01:25:21

+0

請注意***此頁面已過期*** - 今天您只需執行以下操作:http://stackoverflow.com/a/24135522/ 294884 – Fattie 2016-07-11 16:22:49

回答

1

的MediaStore.getBitmap方法是獲得位圖時未指定的樣品大小的便捷方法。如果您使用的是getBitmap(ContentResolver,Uri),並且想要使用樣本大小,只需使用ContentResolver獲取輸入流,然後像平常一樣解碼位圖(首先計算樣本大小,然後使用適當的樣本大小)。

+1

聽起來像是一個很好的方法,代碼會更好回答 – weston 2016-04-28 11:04:08

+0

@weston Google在[link](http://developer.android.com/training/displaying-bitmaps/load-bitmap.html)上提供了這個示例代碼(關於高效加載位圖)。ContentResolver的使用可以通過查找在MediaStore.getBitmap的實現中。它以相同的方式調用內容解析器 – 2016-05-05 14:14:52

+1

我知道你可以在別處找到答案,因爲我必須這樣做,因爲答案是不完整的。每個讀這個答案的人都必須做同樣的工作。一個好的堆棧溢出答案不依賴於外部鏈接來完成它。 – weston 2016-05-05 14:46:47

2

對於那些誰正在尋找的代碼示例:

private static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) >= reqHeight 
       && (halfWidth/inSampleSize) >= reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

public static Bitmap decodeSampledBitmapFromUri(Context context, Uri imageUri, int reqWidth, int reqHeight) throws FileNotFoundException { 

    // Get input stream of the image 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    InputStream iStream = context.getContentResolver().openInputStream(imageUri); 

    // First decode with inJustDecodeBounds=true to check dimensions 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(iStream, null, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeStream(iStream, null, options); 
} 
+0

你真的嘗試過這個功能嗎?我試過這個,函數decodeSampledBitmapFromUri總是返回null。經過相當長的研究後,我發現你不能多次使用相同的輸入流作爲參數到BitmapFactory.decodeStream。 – Dika 2017-11-13 14:16:21