代码之家  ›  专栏  ›  技术社区  ›  stealthcopter

将资源加载到可变位图

  •  25
  • stealthcopter  · 技术社区  · 15 年前

    我正在从这样的资源加载位图:

     Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
    

    我要做的是在位图被绘制到主画布之前对其进行一些更改。 方法(因为在主循环中重复大量的绘图,当它不会改变时,这似乎是浪费)。我将使用以下命令更改位图:

    Canvas c = new Canvas(mBackground);
    c.drawARGB(...); // etc
    

    所以我自然会得到一个例外

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

    为了避免我复制了位图以便它是可变的

    Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
    

    这就避免了这个问题,尽管它有时会导致内存不足,但是否知道更好的实现我想要的东西的方法?

    4 回复  |  直到 11 年前
        1
  •  11
  •   Moss    15 年前

    有几种方法可以创建它的副本。此线程可能有助于您: http://www.anddev.org/how_to_modify_the_image_file-t513.html

        2
  •  23
  •   KNfLrPn    14 年前

    使用 decodeResource(Resources res, int id, BitmapFactory.Options opts) 并指定 inMutable 在选项中。

    http://developer.android.com/reference/android/graphics/BitmapFactory.html

        3
  •  1
  •   suckgamony    11 年前

    你最好用 RapidDecoder .

    import rapid.decoder.BitmapDecoder;
    
    Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image)
            .mutable().decode();
    

    适用于API 8级。

        4
  •  0
  •   Community Mohan Dere    9 年前

    如果您需要处理所有API级别,请查看以下文章:

    https://stackoverflow.com/a/16314940/878126