Loading a resource to a mutable bitmap
Solution 1
There are several ways to create a copy of it. This thread might help you: http://www.anddev.org/how_to_modify_the_image_file-t513.html
Solution 2
Use decodeResource(Resources res, int id, BitmapFactory.Options opts)
and specify inMutable
in the options.
http://developer.android.com/reference/android/graphics/BitmapFactory.html
Solution 3
You'd better use RapidDecoder.
import rapid.decoder.BitmapDecoder;
Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image)
.mutable().decode();
Works for API level 8.
Related videos on Youtube
Comments
-
stealthcopter over 3 years
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?
-
Sudar Nimalan over 12 yearsCopying inside memory doesn't work for me if it is original image, i found a way using MappedByteBuffer, I have blogged it here:sudarnimalan.blogspot.com/2011/09/…
-
Harri over 12 yearsWorks, but needs at least API level 11.
-
STeN over 12 yearsI can confirm, that the API level is a problem there:(