2013-10-25 4 views
5

Я пытаюсь рисовать на загружаемом пользователем растровом изображении. Это находится в 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); 

Следующий код, когда пользователь нажимает кнопку, чтобы получить растровое изображение и после успешного получения растрового изображения. Это в конце «onActivityResult»

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

Я могу рисовать на пустой растровое изображение, которое производится в течение onCreate, но когда пользователь загружает новое растровое изображение и попытаться сделать это не показывает , Однако новый битмап загружен.

Я устал делать это слишком

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

тогда он дал мне ошибку.

Кто-нибудь знает, что я делаю что-то неправильно?

EDIT: Это файл журнала:

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 
+0

Вы можете увидеть растровое изображение в 'imageView' после получения результата? Какая у вас ошибка? –

+0

Да, он загружается. Я просто не могу опираться на это. Нет крушения. Но когда я устал canvas = new Canvas (BitmapFactory.decodeFile (picturePath)); Я получаю эту – JamesEX

+0

com.example.milestone2.Draw.onActivityResult (Draw.java:139) 10-25 02: 59: 05,829: E/AndroidRuntime (1826): \t в android.app.Activity.dispatchActivityResult (активность .java: 5293) 10-25 02: 59: 05.829: E/AndroidRuntime (1826): \t at android.app.ActivityThread.deliverResults (ActivityThread.java:3315) 10-25 02: 59: 05.829: E/AndroidRuntime (1826): \t ... еще – JamesEX

ответ

15

Вы должны установить битовую карту, которая возвращается в качестве растрового изображения для холста. Но BitmapFactory.decodeFile(picturePath) возвращает неизменяемое растровое изображение. Преобразуйте это в изменяемое растровое изображение, а затем установите его в холст.

Попробуйте это:

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

Спасибо, что я работал с ним, я едва мог его увидеть, он рисует верхний правый угол. Я не уверен, почему, но мой рисунок на картинке ограничивается левым верхним углу и углом фотографии. – JamesEX

+0

Я попробую это Bitmap loadedBitmap = BitmapFactory.decodeFile (picturePath); \t Bitmap scaledloadedBitmap = Bitmap.createScaledBitmap (loadedBitmap, 120, 120, false); \t Bitmap drawableBitmap = scaledloadedBitmap.copy (Bitmap.Config.ARGB_8888, true); – JamesEX

+0

Действительно это работает !!! –

Смежные вопросы