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限制.
我使用这个简单的经验法则:在服务器上完成繁重的工作(内存/ CPU).
因此,编写一些获取图像的servlet,将其调整到指定的尺寸(可能也会减小像素深度)并返回结果.
一块蛋糕,它适用于您需要的任何移动设备.
祝好运!
| 归档时间: |
|
| 查看次数: |
4871 次 |
| 最近记录: |