2

我试图使用 将位图图像设置为画布 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() 运行良好。

请让我知道你有什么想法...

提前致谢

快乐编码

4

3 回答 3

6

可能会抛出 IllegalStateException,因为您正在加载位图 (eBit) 并mCanvas.setBitmap(eBit) 在未检查位图是否可变的情况下使用。这是在位图上绘制所必需的。要确保您的位图是可变的,请使用:

eBit=LoadBMPsdcard(filePath);
Bitmap bitmap = eBit.copy(Bitmap.Config.ARGB_8888, true);
canvas.setBitmap(bitmap);
于 2013-06-14T10:55:43.233 回答
2

尝试使用drawBitmap而不是 setBitmap。看起来您已经通过将位图传递给画布构造函数来设置要绘制的位图,所以现在您只需在其上绘制所有内容。

于 2011-05-10T08:07:36.290 回答
1

Canvas.setBitmap()IllegalStateException当且仅当Bitmap.isMutable()返回 true 时抛出。Bitmap.createBitmap()仅以所有形式构建不可变的 Bitmap 实例。要创建可变位图,您可以使用new Bitmap()Bitmap.copy(true),这取决于您是否有要开始的源位图。对我来说,一个典型的块看起来像:

Bitmap image = ...
Canvas c = new Canvas(image.isMutable()?image:image.copy(true));
...

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

于 2013-10-11T19:24:15.917 回答