2013-10-31 40 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