【发布时间】:2011-09-07 00:10:27
【问题描述】:
我正在使用下面的代码连接两个图像,但它会引发 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;
}
更新:我尝试了以下两个答案,但仍然无法创建如此大尺寸的位图,问题是生成的位图在 2400x3200 左右尺寸太大,因此内存不足.
如何在不耗尽内存的情况下加入大图像?
【问题讨论】:
-
“内存不足”从何而来——BitmapFactory.decodeFile()?
-
这一行位图 bmOverlay = Bitmap.createBitmap(bmp1.getWidth() + bmp2.getWidth(), height, Bitmap.Config.ARGB_8888);
-
在创建新位图之前,为什么不压缩两个位图并尝试一下。这将更好地减少内存
-
@Andro_Selva 我不能这样做,因为要缩放图像,这样做会降低质量
-
您可以尝试将 bmp 转换为 png 吗?然后它可以被压缩到更小的尺寸,但仍然不会失去任何质量。然后,如果 Java API 对此很聪明,并且允许您仍然访问每个像素的 RGB 颜色值而无需将其实际扩展为 BMP 数组,那么您可以手动构建一个 BMP 文件并将其流式传输到文件中。这样,您可以一次将所需的所有数据存储在内存中,并且一次可以缓冲和流出生成的图像几 KB。
标签: android bitmap out-of-memory