加入大图像时出现OutOfMemory错误

ing*_*abh 12 android bitmap out-of-memory

我正在使用下面的代码加入两个图像,但它会抛出一个OutOfMemory错误,我的图像每个大约1MB.

private Bitmap overlayMark(String first, String second)
{
    Bitmap bmp1, bmp2;
    bmp1 = BitmapFactory.decodeFile(first);
    bmp2 = BitmapFactory.decodeFile(second);
    if (bmp1 == null || bmp2 == null)
        return bmp1;

    int height = bmp1.getHeight();
    if (height < bmp2.getHeight())
        height = bmp2.getHeight();

    Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth() + bmp2.getWidth(), height,
            Bitmap.Config.ARGB_8888);// Out of memory
    Canvas canvas = new Canvas(bmOverlay);
    canvas.drawBitmap(bmp1, 0, 0, null);
    canvas.drawBitmap(bmp2, bmp1.getWidth(), 0, null);
    bmp1.recycle();
    bmp2.recycle();
    return bmOverlay;
}
Run Code Online (Sandbox Code Playgroud)

更新:我尝试了下面两个答案,但它仍然没有完全创建这么大的位图,问题是结果位图在2400x3200左右太大,所以它的内存不足.

如何在不耗尽内存的情况下加入大型图像?

Shu*_*aha 13

在不将图像加载到内存中的情况下,您可以使用inJustDecodeBounds获取图像的大小.Bitmap返回null,但所有参数都已设置.您可以相应缩小图像.

如果您的JPEG图像各为1 MiB,转换为BMP确实会占用大量内存.您可以通过图像的尺寸轻松计算其BMP等效值.预计这种大图像的转换确实会崩溃.Android仅将其应用限制为16 MiB VM.

也可以使用RGB_565代替ARGB_8888.

因此,您唯一的解决方案是:(a)使用BitmapFactory.Options.inSampleSize缩小图像或(b)使用Android NDK,其中不存在16 MiB限制.


bes*_*sss 5

我使用这个简单的经验法则:在服务器上完成繁重的工作(内存/ CPU).

因此,编写一些获取图像的servlet,将其调整到指定的尺寸(可能也会减小像素深度)并返回结果.

一块蛋糕,它适用于您需要的任何移动设备.

祝好运!