如何使用大型Bitmap创建画布,在其上绘制,然后缩放到屏幕大小以节省内存?

时间:2013-12-14 00:16:13

标签: android memory bitmap android-canvas scale

简单地说,由于我需要的细节,我有一个1800 x 1800像素的Bitmap资源。我从Bitmap创建一个画布,然后在它上画画。绘图完成后,它附加到ImageView。它适用于具有大堆的设备,但在小型设备上,它会崩溃。添加到画布时,所有设备的位图大小必须相同,因为我绘制的坐标是位图上的精确位置。

这是我的代码

initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap);  
mutableBitmap = initialBitmap.copy(Bitmap.Config.RGB_565, true);  
canvas = new Canvas(mutableBitmap);  

....draw stuff here  
canvas.drawLine(x, y, x2, y2, paint);   

ImageView.setImageBitmap(mutableBitmap);  
ImageView..setAdjustViewBounds(true);

我确信有更好的方法。我已经研究过OpenGL但尚未尝试过。它看起来很复杂,我想要完成的任务。

1 个答案:

答案 0 :(得分:0)

BitmapFactory.Options o = new BitmapFactory.Options();
o.inMutable = true;
initialBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.VeryLargeBitmap, o);

这样做可以消除将位图复制到不可变位的需要。当你完成它(保存到文件或为新文件准备好)时,执行以下操作:

initialBitmap.recycle();
initialBitmap = null;

删除对它的任何引用(注意:可能没有必要回收,但我喜欢“以确保”)。

编辑:

特别要注意的是,创建一个Bitmap是CPU密集型的,因此最好在一个线程中对其进行解码,并在准备就绪时开始绘制。您应该从不onDrawdraw方法中创建位图。