Android 将图像合并为一个图像会导致OutofMemory错误

Android 将图像合并为一个图像会导致OutofMemory错误,android,bitmap,android-image,android-memory,Android,Bitmap,Android Image,Android Memory,我让用户从他们的图库中检索4幅图像,在选择每幅图像后,我将其绘制到画布上,然后将图像压缩为on图像 这是我存储检索到的图像的方式(最多执行四次): 这就是我如何组合我的图像: result = Bitmap.createBitmap(bmImages[0].getWidth() * 2, bmImages[0].getHeight() * 2, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); Paint paint =

我让用户从他们的图库中检索4幅图像,在选择每幅图像后,我将其绘制到画布上,然后将图像压缩为on图像

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

这就是我如何组合我的图像:

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();
}
尝试在此行创建位图时会发生这种情况:

result = Bitmap.createBitmap(bmImages[0].getWidth() * 2, bmImages[0].getHeight() * 2, Bitmap.Config.ARGB_8888);
如何在不使用大量内存的情况下组合图像

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

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

欢迎您尝试使用NDK将代码移动到C/C++中创建此位图。我仍然认为你会在一些设备上崩溃,因为你正试图为这个位图使用~256MB的系统RAM,而这可能会对低端Android设备产生可怕的影响

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

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


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

我最终将图像缩小一半,然后将其保存到位图中。这就是我使用的:

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

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

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

请提供一个演示您的问题的示例。这将包括您用来“从他们的图库中检索4个图像,选择每个图像后,我将其绘制到画布上,然后将图像压缩到on image”的代码。这还包括完整的堆栈跟踪,显示您的
OutOfMemoryError
。抱歉。我已经更新了更多信息。我也尝试过使用“Bitmap.Config.RGB_565”,但仍然无法解决内存错误。请提供一个演示您的问题的示例。这将包括您用来“从他们的图库中检索4个图像,选择每个图像后,我将其绘制到画布上,然后将图像压缩到on image”的代码。这还包括完整的堆栈跟踪,显示您的
OutOfMemoryError
。抱歉。我已经更新了更多信息。我也尝试过使用'Bitmap.Config.RGB_565',但我仍然没有记忆错误。谢谢,我不确定是否使用NDK,我没有任何经验。但你说得对,我的图像太大了。我最终缩小了它们的规模,然后保存了它们。谢谢谢谢,我不确定是否使用NDK,我没有这方面的经验。但你说得对,我的图像太大了。我最终缩小了它们的规模,然后保存了它们。谢谢
            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);