Home » Android » android – Trying to draw on a user loaded bitmap

android – Trying to draw on a user loaded bitmap

Posted by: admin June 15, 2020 Leave a comment


I’m trying to draw on a user loaded bitmap. This is in onCreate.

imageView = (ImageView) this.findViewById(R.id.ImageView);

Display currentDisplay = getWindowManager().getDefaultDisplay();
float dw = currentDisplay.getWidth();
float dh = currentDisplay.getHeight();
bitmap = Bitmap.createBitmap((int) dw, (int) dh,
canvas = new Canvas(bitmap);
paint = new Paint();

Next code is when the user press a button to get the bitmap and after the bitmap is successfully retrieved. It is at the end of

canvas = new Canvas(bitmap);
paint = new Paint();

I’m able to draw on the blank bitmap that is made during onCreate, but when the user loads the new bitmap and try to draw it doesn’t show. The new bitmap is loaded though.

I tired doing this too

canvas = new Canvas(BitmapFactory.decodeFile(picturePath));

then it gave me error.

Anyone know if i’m doing something wrong?

EDIT:THis is the log file:

10-25 03:19:31.409: W/System.err(1971): java.lang.Exception: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
10-25 03:19:31.409: W/System.err(1971):     at com.example.milestone2.Draw.onActivityResult(Draw.java:148)
10-25 03:19:31.409: W/System.err(1971):     at android.app.Activity.dispatchActivityResult(Activity.java:5293)
10-25 03:19:31.409: W/System.err(1971):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)
10-25 03:19:31.409: W/System.err(1971):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3362)
10-25 03:19:31.409: W/System.err(1971):     at android.app.ActivityThread.access$1100(ActivityThread.java:141)
10-25 03:19:31.419: W/System.err(1971):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
10-25 03:19:31.419: W/System.err(1971):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-25 03:19:31.419: W/System.err(1971):     at android.os.Looper.loop(Looper.java:137)
10-25 03:19:31.428: W/System.err(1971):     at android.app.ActivityThread.main(ActivityThread.java:5041)
10-25 03:19:31.428: W/System.err(1971):     at java.lang.reflect.Method.invokeNative(Native Method)
10-25 03:19:31.428: W/System.err(1971):     at java.lang.reflect.Method.invoke(Method.java:511)
10-25 03:19:31.428: W/System.err(1971):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-25 03:19:31.428: W/System.err(1971):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-25 03:19:31.428: W/System.err(1971):     at dalvik.system.NativeStart.main(Native Method)
10-25 03:19:31.438: W/System.err(1971): Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor
10-25 03:19:31.448: W/System.err(1971):     at android.graphics.Canvas.<init>(Canvas.java:127)
10-25 03:19:31.469: W/System.err(1971):     at com.example.milestone2.Draw.onActivityResult(Draw.java:141)
10-25 03:19:31.469: W/System.err(1971):     ... 13 more
10-25 03:19:31.588: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property
How to&Answers:

You need to set the bitmap that is returned as the bitmap for the canvas. But BitmapFactory.decodeFile(picturePath) returns an immutable bitmap. Convert this to a mutable bitmap and then set is to the canvas.

Try this:

Bitmap loadedBitmap = BitmapFactory.decodeFile(picturePath);
Bitmap drawableBitmap = loadedBitmap.copy(Bitmap.Config.ARGB_8888, true);

canvas = new Canvas(drawableBitmap);
paint = new Paint();