【问题标题】:Creating canvas from loaded PNG in Android在Android中从加载的PNG创建画布
【发布时间】:2012-08-06 19:10:28
【问题描述】:

我正在尝试从已加载到位图中的 PNG 文件创建画布,但它给出了错误。代码如下:

public Bitmap CABINET_Bitmap;

AssetManager assetManager = this.getAssets();
inputStream = assetManager.open("background.png");
CABINET_Bitmap = BitmapFactory.decodeStream(inputStream);

// Next line gives error
Canvas cv = new Canvas(CABINET_Bitmap);

如果我创建位图,而不是加载它,通过这样做:

CABINET_Bitmap = Bitmap.createBitmap(480, 640, Config.RGB_565);
Canvas cv = new Canvas(CABINET_Bitmap);

然后画布创建工作。任何想法我做错了什么?

【问题讨论】:

    标签: android canvas bitmap png


    【解决方案1】:

    文档说明:

    用指定的位图构造一个画布来绘制。位图 必须是可变的。

    画布的初始目标密度与给定的相同 位图的密度。

    所以我假设BitmapFactory.decodeStream() 返回一个不可变位图,而Bitmap.createBitmap() 返回一个可变位图。而是使用BitmapFactory.Options 并将inMutable 设置为true。

    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inMutable = true;
    CABINET_Bitmap = BitmapFactory.decodeStream(inputStream, o);
    Canvas cv = new Canvas(CABINET_Bitmap);
    

    看看这是否有效。

    【讨论】:

    • 听起来不错!不幸的是,虽然我的智能感知向我显示了一个“inMutable”属性,但当我运行“o.inMutable = true;”行时我收到一个错误:NoSuchFieldError...
    • 哦。我刚刚注意到它是在 API 11 中添加的。嗯,我很确定这是问题所在。因此,您需要将位图从不可变转换为可变。 anddev.org/how_to_modify_the_image_file-t513.htmlstackoverflow.com/questions/4349075/… 似乎是开始的好地方。我希望这会有所帮助。
    • 太棒了,我应该能够修复它。谢谢你的帮助。节省了我用头撞桌子的几个小时。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多