【问题标题】:create Bitmap from byteArray in android在android中从byteArray创建位图
【发布时间】:2011-11-13 14:56:30
【问题描述】:

我想从一个字节数组创建一个位图。

我尝试了以下代码

Bitmap bmp;

bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

ByteArrayInputStream bytes = new ByteArrayInputStream(data); 
BitmapDrawable bmd = new BitmapDrawable(bytes); 
bmp = bmd.getBitmap(); 

但是,当我试图用位图初始化 Canvas 对象时

Canvas canvas = new Canvas(bmp);

导致错误

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

那么如何从 byteArray 中获取可变位图。

提前致谢。

【问题讨论】:

    标签: android canvas bitmap


    【解决方案1】:

    您需要一个可变的Bitmap 才能创建Canvas

    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
    Bitmap mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap); // now it should work ok
    

    编辑:正如 Noah Seidman 所说,您可以在不创建副本的情况下进行操作。

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inMutable = true;
    Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, options);
    Canvas canvas = new Canvas(bmp); // now it should work ok
    

    【讨论】:

    • Bitmap.copy() 不完全创建一个新数组吗?这似乎是对内存的浪费。我很想知道如何直接获取可变位图。
    • 不幸的是,我不知道有任何其他方法可以获取可变位图(至少来自ByteArray)。
    • 使用 BitmapFactory.Options.inMutable = true。不需要复制,太浪费了。
    • BitmapFactory.Options.inMutable 是 api 级别 11,因此并非在所有情况下都有帮助
    • 我正在尝试从相机预览 (onPreviewFrame(byte[] frame,...) 中放入 RAW 数据,但我猜这种方法只吃 PNG/JPG 字节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2012-04-28
    • 2018-12-26
    • 2013-07-18
    • 2013-11-13
    相关资源
    最近更新 更多