【问题标题】:IllegalStateException while adding bitmap to Canvas将位图添加到 Canvas 时出现 IllegalStateException
【发布时间】:2013-10-12 03:24:15
【问题描述】:

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

如果您有任何想法,请告诉我...

提前致谢

快乐编码

【问题讨论】:

  • 发布你的 logcat 和 LoadBMPsdcard() 方法

标签: android canvas illegalstateexception


【解决方案1】:

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

eBit=LoadBMPsdcard(filePath);
Bitmap bitmap = eBit.copy(Bitmap.Config.ARGB_8888, true);
canvas.setBitmap(bitmap);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-18
        • 2014-03-28
        • 2021-12-27
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多