Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to draw on a user loaded bitmap

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,
        Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(bitmap);
imageView.setOnTouchListener(this);

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 "onActivityResult"

canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
imageView.setOnTouchListener(this);

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
like image 547
JamesEX Avatar asked Oct 25 '13 02:10

JamesEX


People also ask

How do you draw a bitmap?

To draw on a bitmap, use the image control's canvas and attach the mouse-event handlers to the appropriate events in the image control. Typically, you would use region operations (fills, rectangles, polylines, and so on). These are fast and efficient methods of drawing.

What is bitmap in canvas?

Canvas is the place or medium where perfroms/executes the operation of drawing, and Bitmap is responsible for storing the pixel of the picture you draw.

How do I create a bitmap in canvas?

To create a bitmap object on a canvas C , use: id = C . create_bitmap( x , y , *options ...) which returns the integer ID number of the image object for that canvas.


1 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();
paint.setColor(Color.BLUE);
imageView.setImageBitmap(drawableBitmap);
imageView.setOnTouchListener(this);
like image 140
Amulya Khare Avatar answered Sep 30 '22 16:09

Amulya Khare