0

我知道有很多关于“使用 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。有谁知道问题可能是什么?

4

1 回答 1

0

在这两行之后...

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

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

您需要调试以验证,但我怀疑图像有时以某种方式为空或无效。

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

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

  • 您的应用/活动是纵向的
  • 你触发相机,它从纵向开始
  • 您在相机中旋转到风景
  • 您返回到您的应用程序/活动,该应用程序/活动立即为横向重新创建。此时您是否会丢失对图像的参考?
于 2013-10-31T12:39:22.530 回答