【问题标题】:Loading a resource to a mutable bitmap将资源加载到可变位图
【发布时间】:2011-04-11 05:16:54
【问题描述】:

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

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

我想要做的是在位图被我的 draw 方法绘制到主画布之前对位图进行一些更改(因为在我的主循环中重复大量绘图似乎很浪费它不会改变)。我正在使用以下内容对位图进行更改:

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);

这避免了这个问题,但它有时会导致 OutOfMemoryExceptions,知道有什么更好的方法来实现我想要的吗?

【问题讨论】:

    标签: android bitmap out-of-memory android-canvas mutable


    【解决方案1】:

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

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

    【讨论】:

    • 有效,但至少需要 API 级别 11。
    • 我可以确认,API 级别存在问题:(
    【解决方案2】:

    有几种方法可以创建它的副本。这个帖子可能对你有帮助:http://www.anddev.org/how_to_modify_the_image_file-t513.html

    【讨论】:

    【解决方案3】:

    你最好使用RapidDecoder

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

    适用于 API 级别 8。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        你的:

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

        用途:

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inMutable = true;
        
        Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image, options);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-26
          • 1970-01-01
          • 1970-01-01
          • 2011-03-01
          • 2011-06-18
          相关资源
          最近更新 更多