2013-08-22 56 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的位置 –