【问题标题】:Android BitmapFactory not loading dimensionsAndroid BitmapFactory 不加载尺寸
【发布时间】:2013-10-31 11:50:28
【问题描述】:

我知道有很多关于“使用 android 加载图像”主题的主题,但不幸的是,我没有在其中任何一个中找到解决问题的方法。所以这是我的问题:

我想保存一张大图和另一张以供以后裁剪,这是我的代码:

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。有谁知道问题可能是什么?

【问题讨论】:

  • "bmOptions.inJustDecodeBounds = true;"比Android的另一个错误?解决方案之一是编写自己的解码程序以只读大小。在调用该代码之前检查您的应用程序有多少可用内存。如果你有很少:只有 1 mb 或类似的东西,那么你的应用程序已经使用了很多并且没有地方执行代码

标签: android image-processing out-of-memory android-image


【解决方案1】:

这两行之后……

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

...bmOptions 仅在解码有效时才包含有效的 outHeight 和 outWidth。如果不是,它们将包含 -1,正如您所指出的。

您需要调试来验证,但我怀疑图像有时在某些方面为空或无效。

您说当您背靠背拍摄多张照片时会发生这种情况。也许垃圾收集器跟不上,或者您在处理它们时没有释放对图像/位图的引用?你以什么方式触发相机并捕捉结果?

至于您关于轮换的第二点,这可能是问题所在:

  • 您的应用/活动是纵向的
  • 您触发了相机,相机以纵向开始
  • 您在相机中旋转到横向
  • 您返回到您的应用程序/活动,该应用程序/活动立即为横向重新创建。此时您是否会丢失对图像的引用?

【讨论】:

  • 在对我的应用程序进行大量测试后,我遇到了以下问题:每次启动该过程时,我都会丢失大约 2 MB 的 RAM。这意味着一段时间后我的应用程序将关闭。我为解决这个问题所做的工作:-)不创建原始图像-)将样本大小设置为16(而不是计算出的2)-)完全删除位图问题保持不变;我总是丢失 2 MB RAM。有谁知道问题可能是什么?
  • 我很高兴你取得了进展,很抱歉我无法提供更多帮助。听起来你可能有内存泄漏。您是否保留了对垃圾收集器无法释放的失效对象的任何引用?我认为最好提出一个新问题,因为很少有人会在这里看到它。
  • 是的,你可能是对的。感谢您一直以来的帮助!我稍后会发布一个关于我的记忆问题的新问题
  • 我发现了我的问题。我使用了不回收图像的第三方cropimage 功能。现在一切正常:)
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多