将资源加载到可变位图

ste*_*ter 25 android bitmap mutable out-of-memory android-canvas

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

 Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);
Run Code Online (Sandbox Code Playgroud)

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

Canvas c = new Canvas(mBackground);
c.drawARGB(...); // etc
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
Run Code Online (Sandbox Code Playgroud)

所以为了避免这种情况,我制作了位图的副本,以便它是可变的

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);
Run Code Online (Sandbox Code Playgroud)

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

KNf*_*rPn 24

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

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

  • 可行,但至少需要API级别11. (11认同)

Mos*_*oss 11

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

  • 在内存中复制如果它是原始图像对我不起作用,我找到了使用MappedByteBuffer的方法,我在这里写了博客:http://sudarnimalan.blogspot.com/2011/09/android-convert-immutable-bitmap- into.html (4认同)