将资源加载到可变位图

发布于 2024-09-19 04:34:30 字数 665 浏览 12 评论 0原文

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

 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,确实知道任何更好的方法实现我想要的?

I am loading a bitmap from a resource like so:

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

What I want to do is make some changes to the bitmap before It gets drawn to the main canvas in my draw method (As it would seem wasteful to repeat lots of drawing in my main loop when it isn't going to change). I am making the changes to the bitmap with the following:

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

So naturally I get an exception

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

So to avoid that I made a copy of the bitmap so that it is mutable

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

Which avoid the problem however it sometimes causes OutOfMemoryExceptions, do know any better ways of achieving what I want?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北凤男飞 2024-09-26 04:34:30

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

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

Use decodeResource(Resources res, int id, BitmapFactory.Options opts) and specify inMutable in the options.

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

泅渡 2024-09-26 04:34:30

你最好使用RapidDecoder

import rapid.decoder.BitmapDecoder;

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

适用于 API 级别 8。

You'd better use RapidDecoder.

import rapid.decoder.BitmapDecoder;

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

Works for API level 8.

无所谓啦 2024-09-26 04:34:30

代替你的:

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

Instad of yours:

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

Use:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image, options);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文