25

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

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

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

4

5 回答 5

24

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

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

于 2011-10-19T03:44:33.723 回答
10

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

于 2010-11-22T11:40:59.867 回答
1

你最好使用RapidDecoder

import rapid.decoder.BitmapDecoder;

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

适用于 API 级别 8。

于 2014-01-05T09:01:19.877 回答
0

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

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

于 2013-08-24T10:04:30.560 回答
0

代替你的:

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);
于 2019-09-12T14:04:25.507 回答