2012-10-02 65 views
1

我創建的小應用程序,從畫廊或相機的圖像作品。負荷前檢查Android的圖像大小的內存

這一切工作正常,但。 在小屏幕和小內存大小的設備(HTC Desire)上,我從其他手機下載了一些全尺寸的圖像,而且它們更大(該手機上的800萬像素攝像頭)。

如果我嘗試加載,對於我的小相機龐大的圖像,它會立即崩潰。

那麼,如何實現某種檢查,並縮減該圖像,但仍加載它是否正確?

我做大規模圖像它們被加載後回落,但這個東西出現崩潰之前應該做的。

Tnx。

  InputStream in = null; 
      try { 
       in = getContentResolver().openInputStream(data.getData()); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      // get picture size. 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(in, null, options); 
      try { 
       in.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      // resize the picture for memory. 
      int screenH = getResources().getDisplayMetrics().heightPixels; //800 
      int screenW = getResources().getDisplayMetrics().widthPixels; //480 
      int width = options.outWidth/screenW; 
      int height = options.outHeight/screenH; 

      Log.w("Screen Width", Integer.toString(width)); 
      Log.w("Screen Height", Integer.toString(height)); 

      int sampleSize = Math.max(width, height); 
      options.inSampleSize = sampleSize; 
      options.inJustDecodeBounds = false; 
      try { 
       in = getContentResolver().openInputStream(data.getData()); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      // convert to bitmap with declared size. 
      Globals.INSTANCE.imageBmp = BitmapFactory.decodeStream(in, null, options); 
      try { 
       in.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

回答

1

可以避開加載位圖在內存中只設置

inJustDecodeBounds = true 

inJustDecodeBounds將讓您無需解碼只圖像的邊界進行解碼。鑑於你的位圖的heightwidth,你可以使用下采樣。

inSampleSize

作爲DOC停留:

如果設置爲值> 1,要求解碼器以子採樣原始圖像 ,返回一個較小的圖像以節省內存。

int tmpWidth = bitmapWidth; 
int tmpHeight = bitmapHeigth; 
int requiredSize = ... 
while (true) { 
if (tmpWidth/2 < requiredSize 
    || tmpHeight/2 < requiredSize) 
     break; 
    tmpWidth /= 2; 
    tmpHeight /= 2; 
    ratio *= 2; 
} 

編輯:所需32位Bitmap內存width * height * 4

+0

我必須承認,我沒有得到你的答案。我將用代碼編輯我的問題。 – Balkyto

+0

所以我嘗試將它安裝在任何屏幕上,閱讀屏幕大小和屏幕密度,但它仍然很大。我必須錯過關於比率/密度的事情。 – Balkyto

+0

我認爲這是大的(800或480)。嘗試設置inSampleSize = 8 – Blackbelt