Loading a resource to a mutable bitmap

31,245

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.

Share:
31,245

Related videos on Youtube

stealthcopter
Author by

stealthcopter

Creator of Nexus Revamped Live Wallpaper

Updated on September 13, 2020

Comments

  • stealthcopter
    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
    Sudar Nimalan over 12 years
    Copying 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
    Harri over 12 years
    Works, but needs at least API level 11.
  • STeN
    STeN over 12 years
    I can confirm, that the API level is a problem there:(