2013-08-22 58 views
1

這是我使用的代碼:位圖無法加載一個2MB的圖像

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 8; 
Bitmap imatgeOriginal = BitmapFactory.decodeFile(imageUrl, options); 
Bitmap resizedbitmap = Bitmap.createScaledBitmap(imatgeOriginal, 1000, 1000, true); 

正如你可以看到我調整與選擇的圖像,但反正它只是崩潰的最後一行,拋一個NullPointerException。所以imatgeOriginalnull

爲什麼會發生這種情況?

一些注意事項:

  • 的圖像是2 MB(大於16 MB極限以下),大小爲1105×1491
  • 圖像確實存在
  • 相同的代碼可與較小的圖像大於1.5 MB

輸出中的logcat:

08-22 15:11:13.249: E/AndroidRuntime(5404): FATAL EXCEPTION: main 
08-22 15:11:13.249: E/AndroidRuntime(5404): 
java.lang.NullPointerException 08-22 15:11:13.249: 
E/AndroidRuntime(5404):  at 
android.graphics.Bitmap.createScaledBitmap(Bitmap.java:432) 08-22 
15:11:13.249: E/AndroidRuntime(5404): at 
myclass.onAnimationEnd(productView.java:2126) 08-22 15:11:13.249: 
E/AndroidRuntime(5404):  at 
android.view.animation.AnimationSet.getTransformation(AnimationSet.java:397) 

編輯:

發生了一些奇怪的事情,文件映像存在,路由是正確的。然而,android檢測到這個圖像爲CORRUPT或至少它無法打開任何工具(默認畫廊,文件瀏覽器,沒有我的應用程序)。 但是,如果我將圖像下載到我的計算機上,圖像將完美顯示。這個應用程序也在iOS中運行,同一圖像實際上可見並且看起來沒有損壞。

所以我想在Android中加載JPEG文件有一些限制。

你們有類似的問題嗎?

一些資源,我發現: http://code.google.com/p/skia/issues/detail?id=69#c2 Unable to load JPEG-image with BitmapFactory.decodeFile. Returns null

+0

發佈logcat輸出。 –

+1

投票結束這個問題的人不應該這樣做。在這個問題上沒有任何類似的... omg。 – Reinherd

+0

@ S.D。完成,檢查出來。 2126行是我在這篇文章中最後一個。 – Reinherd

回答

0

可以壓縮你的位圖大小Bitmap.compress()

,並嘗試這種方法,會降低其尺寸將可能幫助你加載它,因爲2MB對於某些電話來說是巨大的

int MAX_IMAGE_SIZE = 200 * 1024; // max final file size 
Bitmap bmpPic = BitmapFactory.decodeFile(fileUri.getPath()); 
if ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) { 
    BitmapFactory.Options bmpOptions = new BitmapFactory.Options(); 
    bmpOptions.inSampleSize = 1; 
    while ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) { 
     bmpOptions.inSampleSize++; 
     bmpPic = BitmapFactory.decodeFile(fileUri.getPath(), bmpOptions); 
    } 
    Log.d(TAG, "Resize: " + bmpOptions.inSampleSize); 
} 
int compressQuality = 104; // quality decreasing by 5 every loop. (start from 99) 
int streamLength = MAX_IMAGE_SIZE; 
while (streamLength >= MAX_IMAGE_SIZE) { 
    ByteArrayOutputStream bmpStream = new ByteArrayOutputStream(); 
    compressQuality -= 5; 
    Log.d(TAG, "Quality: " + compressQuality); 
    bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream); 
    byte[] bmpPicByteArray = bmpStream.toByteArray(); 
    streamLength = bmpPicByteArray.length; 
    Log.d(TAG, "Size: " + streamLength); 
} 
try { 
    FileOutputStream bmpFile = new FileOutputStream(finalPath); 
    bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile); 
    bmpFile.flush(); 
    bmpFile.close(); 
} catch (Exception e) { 
    Log.e(TAG, "Error on saving file"); 
} 
+0

如果我沒有錯,加載時不能壓縮。首先你必須加載,然後壓縮。無論如何,在我的代碼中,我已經在壓縮圖像,但是在加載它時崩潰了。 – Reinherd

+0

哦,也許圖像不會加載到它假定爲x.x的位置 –