为了实现类似于QQ发送图片之前可以编辑的功能,我调用了如下方法简单的两汉代码:
// 创建一个与该View大小相同的缓冲区
cacheBitmap = Bitmap.createBitmap(BitmapFactory.decodeFile(picPath));
// 设置cacheCanvas将会绘制到内存中的cacheBitmap上
cacheCanvas.setBitmap(cacheBitmap);
运行程序后报错,报错提示如下图:
百思不得其解的我去网上查了一下,发现每一次次创建Bitmap对象的时候,这个对象都会有一个mutable属性,意思为是否可变的,我们调用
bitmap.isMutable()
发现如果通过:
BitmapFactory.decodeFile(String path)
方法创建的bitmap对象,isMutable是为false,也就是说这个bitmap是不可变的 。
但如果用
Bitmap.createBitmap(int width, int height,
Config config)
BitmapFactory.decodeResource(Resources res, int id)
这两类方法创建的时候,isMutable是为true,所以我们可以知道,如果要
cacheCanvas.setBitmap(cacheBitmap);
这个方法不报错,那么传入的Bitmap参数的isMutable()一定是要为true才行,所以为了实现这个功能,我们可以在
BitmapFactory.decodeFile(String path)
这个方法创建出来的Bitmap对象再做一次转化,注意这里比较奇怪的是mutable这个属性并没有相应的setMutable方法,所以要用如下代码来解决这个问题 :
//第一次获取手机的图片
Bitmap temp = BitmapFactory.decodeFile(picPath);
//对这个Bitmap做一次转化,是它的isMutable为true
Bitmap mBitmap = Bitmap.createScaledBitmap(temp, temp.getWidth(), temp.getHeight(), false);
// 设置cacheCanvas将会绘制到内存中的cacheBitmap上
cacheCanvas.setBitmap(mBitmap);
这样就可以成功解决这个奇怪的问题啦