【问题标题】:Combining images into one image results in OutofMemory error将图像组合成一张图像会导致 OutofMemory 错误
【发布时间】:2015-12-08 16:59:18
【问题描述】:

我让用户从他们的图库中检索 4 张图片,在每张图片被选中后,我将其绘制到画布上,然后将图片压缩成图片。

这就是我存储检索到的图像的方式(最多完成四次):

if (mImageIndex == 0) {
    bmImages[0] = Bitmap.createBitmap(BitmapFactory.decodeFile(imgDecodableString));
    mImageSelected = true;
    Toast.makeText(this, "Image One Added", Toast.LENGTH_LONG).show();
}

这就是我组合图像的方式:

result = Bitmap.createBitmap(bmImages[0].getWidth() * 2, bmImages[0].getHeight() * 2, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
for (int i = 0; i < bmImages.length; i++) {
    canvas.drawBitmap(bmImages[i], bmImages[i].getWidth() * (i % 2), bmImages[i].getHeight() * (i / 2), paint);
    bmImages[i].recycle();
}

它在我的 Samsung Galaxy Tab 4 上运行良好,但在我的 Samsung Note 5 上出现 OutofMemory 错误,它说它试图使用 12,000,000 中的 256,000,000。

这是我的错误:

12-08 10:06:41.021 31308-31308/com.jaymalabs.pic E/AndroidRuntime: java.lang.OutOfMemoryError: Failed to allocate a 253956108 byte allocation with 12059120 free bytes and 11MB until OOM
12-08 10:06:41.021 31308-31308/com.jaymalabs.pic E/AndroidRuntime:     at dalvik.system.VMRuntime.newNonMovableArray(Native Method)

尝试在此行创建我的位图时会发生这种情况:

result = Bitmap.createBitmap(bmImages[0].getWidth() * 2, bmImages[0].getHeight() * 2, Bitmap.Config.ARGB_8888);

如何在不占用大量内存的情况下合并图像?

【问题讨论】:

  • 请提供minimal, complete, and verifiable example 证明您的问题。这将包括您用于“从他们的画廊中检索 4 张图像并在每一张被选中后,我将其绘制到画布上然后将图像压缩成图像”的代码。这还将包括显示您的 OutOfMemoryError 的完整堆栈跟踪。
  • 对不起。我已经用更多信息更新了它。我也尝试过使用“Bitmap.Config.RGB_565”,但仍然出现 OutOfMemoryError。

标签: android bitmap android-image android-memory


【解决方案1】:

如何在不占用大量内存的情况下合并图像?

使用较小的图片。您正在尝试组装大约 8000 x 8000 像素的图像。这对于 Java 堆来说太大了。

欢迎您尝试使用 NDK 将用于创建此位图的代码移动到 C/C++ 中。我仍然希望您会在某些设备上崩溃,因为您正试图为这个位图使用大约 256MB 的系统 RAM,并且请求这可能会对低端 Android 设备产生可怕的影响。

【讨论】:

  • 谢谢,我不确定是否使用 NDK,对此我没有任何经验。但你是正确的,我的图像太大了。我最终缩小了它们然后保存它们。谢谢!
【解决方案2】:

我最终将图像缩小了一半,然后将它们保存为位图。这是我用的:

            pictureBitmap = BitmapFactory.decodeFile(imgDecodableString);
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(pictureBitmap , pictureBitmap.getWidth()/2, pictureBitmap.getHeight()/2,true);
            pictureBitmap.recycle();
            bmImages[0] = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), null, true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2014-12-15
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多