2012-10-17 53 views
0
反轉的位圖時,我具有OutOfMemory錯誤

。這裏是我使用反轉代碼:反轉位圖時的OutOfMemory?

public Bitmap invertBitmap(Bitmap bm) { 
     Bitmap src = bm.copy(bm.getConfig(), true); 

     // image size 
     int height = src.getHeight(); 
     int width = src.getWidth(); 
     int length = height * width; 
     int[] array = new int[length]; 
     src.getPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight()); 
     int A, R, G, B; 
     for (int i = 0; i < array.length; i++) { 
      A = Color.alpha(array[i]); 

      R = 255 - Color.red(array[i]); 
      G = 255 - Color.green(array[i]); 
      B = 255 - Color.blue(array[i]); 

      array[i] = Color.argb(A, R, G, B); 
     } 
     src.setPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight()); 

     return src; 
    } 

的圖像是〜80 kb的大,尺寸是800x1294和圖象具有話它們是黑色和一種無形的背景..
的圖片都在ViewPager ..

回答

0

當你複製BM,嘗試:bm = null;

0

在Android中,由於16MB(在幾乎所有的手機),內存容量爲應用程序,將整個位圖保存在內存中並不明智。這是一種常見的情況,並且可能是開發者正在發生的。

您可以在this stackoverflow線程中獲得有關此問題的許多信息。但我真的強烈要求你閱讀有關Bitmap高效使用的android官方文檔。它們是herehere

0

圖像所使用的內存大小完全不同於該圖像的文件大小。

在一個文件中,圖像可能使用不同的算法(jpg,png等)進行壓縮,並且當以位圖的形式加載到內存中時,它會使用每個像素2或4個字節。

你的情況

所以(你沒有播種的代碼,但它lloks就像你正在使用每像素4個字節),每幅圖像的內存大小爲:

size = width * height * 4; // this is aprox 2MB 

在代碼中,首先你複製將原始位圖添加到新的位圖,然後放置一個數組來操縱顏色。所以總共您使用的是每個圖像反轉的size x 3 = 6MB

有很多關於如何在Android中處理大量位圖的例子,但我會離開你我的想法是最重要的議題:

  • 儘量只使用一個位圖的副本在你的代碼以上
  • 如果您只有圖片中的文字,請使用Bitmap.Config = RGB_565。這隻使用每個像素2個字節,將大小減半。在你不再需要的位圖上調用recycle()
  • Bitmap.Factory有一個規模較大的選項。您可以減小仍適合您需求的圖像大小。

祝你好運。