我让用户从他们的图库中检索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);
如何在不使用大量内存的情况下合并图像?
谢谢!
答案 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);