我试图使用setBitMap
将位图图像设置为画布,那时我得到了一个IllegalStateException。这个画布当前有一些图像,我试图替换它。
任何人都知道为什么会这样?
代码段
editBm = Bitmap.createBitmap(951, 552, Bitmap.Config.ARGB_8888);
Canvas mCanvas=new Canvas(editBm);
eBit=LoadBMPsdcard(filePath); ---->returns a bitmap when the file path to the file is provided
Log.i("BM size", editBm.getWidth()+"");
mCanvas.setBitmap(eBit);
我没有收到任何NullPointer错误,方法LoadBMPsdcard()
运行良好。
请告诉我您的任何想法......
提前致谢
快乐编码
答案 0 :(得分:5)
可能会抛出IllegalStateException,因为您正在加载位图(eBit)并使用mCanvas.setBitmap(eBit)
而不检查位图是否可变。这需要在Bitmap上绘制。要确保您的位图可变,请使用:
eBit=LoadBMPsdcard(filePath);
Bitmap bitmap = eBit.copy(Bitmap.Config.ARGB_8888, true);
canvas.setBitmap(bitmap);
答案 1 :(得分:2)
尝试使用drawBitmap代替setBitmap。看起来你已经通过将它传递给canvas构造函数来设置一个位图来绘制,所以现在你只需要将所有内容绘制到它上面。
答案 2 :(得分:1)
Canvas.setBitmap()
返回true时, IllegalStateException
才会抛出Bitmap.isMutable()
。 Bitmap.createBitmap()
仅以其所有形式构建不可变的Bitmap实例。要创建可变位图,请使用new Bitmap()
或Bitmap.copy(true)
,具体取决于您是否具有要开始的源位图。对我来说,一个典型的块看起来像:
Bitmap image = ...
Canvas c = new Canvas(image.isMutable()?image:image.copy(true));
...
当然,这假设您不介意破坏源位图(我通常不会这样做,但这并不是普遍的)。