2013-10-31 67 views
0

我知道有很多關於「用android加載圖像」主題的線程,但不幸的是我沒有找到解決我的任何問題的解決方案。因此,這裏是我的問題:Android的BitmapFactory不加載尺寸

我要救一個大的圖像,另一個用於後裁剪,這裏是我的代碼:

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 

bmOptions.inJustDecodeBounds = true; 
BitmapFactory.decodeFile(image, bmOptions); 

final int REQUIRED_SIZE = 800; 
int scale = 1; 
while (bmOptions.outWidth/scale/2 >= REQUIRED_SIZE && bmOptions.outHeight/scale/2 >= REQUIRED_SIZE) { 
    scale *= 2; 
} 

bmOptions.inJustDecodeBounds = false; 
bmOptions.inSampleSize = scale; 
bmOptions.inPurgeable = true; 
bmOptions.inInputShareable = true; 

// create the Image for the original File 
try { 
    File origFile = File.createTempFile(origImage, JPEG_FILE_SUFFIX, getAlbumDir()); 
    OutputStream fOut2 = new FileOutputStream(origFile); 
    Bitmap thePic = BitmapFactory.decodeFile(image, bmOptions); 
    thePic.compress(Bitmap.CompressFormat.JPEG, 100, fOut2); 
    fOut2.flush(); 
    fOut2.close(); 
} catch (Exception e) { 
    Log.e(TAG, "Cannot create original Image"); 
} 

mImageBitmap = BitmapFactory.decodeFile(image, bmOptions); 

此代碼〜90%的時間。但有時bmOptions.outHeight & bmOptions.outWidth returns -1和行Bitmap thePic = BitmapFactory.decodeFile(image, bmOptions);

我得到異常:

10-31 12:07:31.645: E/AndroidRuntime(16618): java.lang.OutOfMemoryError 
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:652) 
10-31 12:07:31.645: E/AndroidRuntime(16618): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:391) 

我認爲這個問題可以是:

  • 我採取多種照片背靠背經過一段時間這個錯誤可能 發生
  • 它發生在我把我的顯示器雖然拍攝照片

但經過大量測試後,我仍然不確定這兩種可能性中的任何一種是否屬實,或者是否有其他問題。

有沒有人知道我在做什麼錯?


編輯:

後大量的測試與我的應用程序,我有以下問題:

每次啓動過程中,我失去〜2 MB的RAM。這意味着一段時間後我的應用程序將關閉。

我做了什麼來解決這個問題:

- )不創建原始圖像 - )設定的樣本量爲16(而不是計算2) - )完全去除位圖

問題保持不變;我總是丟失2 MB RAM。有沒有人知道問題可能是什麼?

+0

「bmOptions.inJustDecodeBounds = true;」比在Android的另一個錯誤?解決方案之一就是編寫你自己的解碼rutine來只讀大小。在調用該代碼之前請檢查您的應用程序有多少可用內存。如果你有很少的:只有1 MB或類似的東西,比你的應用程序已經使用很多,沒有地方執行代碼 – 2013-10-31 11:54:46

回答

0

這兩條線後...

bmOptions.inJustDecodeBounds = true; 
BitmapFactory.decodeFile(image, bmOptions); 

... bmOptions將包含一個有效的outHeight和outWidth只有當解碼工作。如果不是,那麼它們將包含-1,正如你所指出的那樣。

您需要進行調試才能進行驗證,但我懷疑該圖像有時爲空或以某種方式無效。

你說這發生在你背靠背拍攝多張照片時。也許垃圾收集器無法跟上,或者當您處理它們時,您不會釋放對圖像/位圖的引用?你用什麼方式觸發相機並捕獲結果?

至於你提到旋轉的第二點,這可能是問題:

  • 您的應用程序/活動是在肖像
  • 你觸發相機,開始在縱向
  • 你旋轉爲橫向而在相機中
  • 您返回到您的應用程序/活動,立即重新創建景觀。在這一點上,你可能會失去對圖像的引用嗎?
+0

經過我的應用程序的大量測試我有以下問題: 每次我開始進程我鬆了〜2 MB的RAM。這意味着一段時間後我的應用程序將關閉。 我做了什麼來解決這個問題: - )不創建原始圖像 - )設定的樣本量爲16(而不是計算2) - )完全去除位圖 問題保持不變;我總是丟失2 MB RAM。有沒有人知道問題可能是什麼? – Markus

+0

我很高興你正在取得進展,對不起我沒有更多的幫助。這聽起來像你可能有內存泄漏。您是否保留對垃圾收集器無法釋放的已停用對象的引用?如果你提出一個新問題,我認爲最好,因爲很少有人會在這裏看到它。 – NigelK

+0

是的,你可能是對的。感謝您一直以來的幫助!我將在後期發佈有關我的記憶問題的新問題 – Markus