将位图添加到Canvas时出现IllegalStateException

时间:2011-05-10 07:34:19

标签: android canvas illegalstateexception

我试图使用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()运行良好。

请告诉我您的任何想法......

提前致谢

快乐编码

3 个答案:

答案 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));
...

当然,这假设您不介意破坏源位图(我通常不会这样做,但这并不是普遍的)。