将图像组合成一个图像会导致OutofMemory erorr

时间:2015-12-08 16:59:19

标签: android bitmap android-image android-memory

我让用户从他们的图库中检索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();
}

它在我的三星Galaxy Tab 4上运行得很好,但是我的三星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);

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

谢谢!

2 个答案:

答案 0 :(得分:2)

  

如何在不使用大量内存的情况下梳理图像?

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

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

答案 1 :(得分:1)

在将图像保存到位图之前,我最终将图像缩小了一半。这是我用过的:

            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);