Исключение IllegalStateException при добавлении растрового изображения на холст

#android #canvas #illegalstateexception

#Android #холст #исключение illegalstateexception

Вопрос:

Я пытался установить растровое изображение на холст с помощью setBitMap , в то время я получил исключение IllegalStateException.В настоящее время на этом холсте есть несколько изображений, я пытаюсь его заменить. У кого-нибудь есть идеи, почему это произошло?

Фрагмент кода

 editBm = Bitmap.createBitmap(951, 552, Bitmap.Config.ARGB_8888);    
        Canvas mCanvas=new Canvas(editBm);
        eBit=LoadBMPsdcard(filePath); ---->returns a bitmap when the file path to the file is provided
        Log.i("BM size", editBm.getWidth() "");
        mCanvas.setBitmap(eBit);
  

Я не получаю никаких ошибок NullPointer, и метод LoadBMPsdcard() работает хорошо.

Пожалуйста, дайте мне знать о любых ваших идеях…

Заранее спасибо

Удачного кодирования

Комментарии:

1. опубликуйте свой logcat и метод LoadBMPsdcard()

Ответ №1:

Исключение IllegalStateException может возникать из-за того, что вы загружаете растровое изображение (eBit) и используете mCanvas.setBitmap(eBit) , не проверяя, является ли растровое изображение изменяемым. Это требуется для рисования на растровом изображении. Чтобы убедиться, что ваше растровое изображение изменяемо, используйте:

 eBit=LoadBMPsdcard(filePath);
Bitmap bitmap = eBit.copy(Bitmap.Config.ARGB_8888, true);
canvas.setBitmap(bitmap);
  

Ответ №2:

Попробуйте использовать drawBitmap вместо setBitmap. Похоже, вы уже настроили растровое изображение для рисования, передав его в конструктор canvas, так что теперь вам просто нужно нарисовать все на нем.

Ответ №3:

Canvas.setBitmap() выдает, IllegalStateException если и только если Bitmap.isMutable() возвращает true. Bitmap.createBitmap() создает только неизменяемый экземпляр Bitmap во всех его формах. Для создания изменяемого растрового изображения вы либо используете new Bitmap() , либо Bitmap.copy(true) , в зависимости от того, есть ли у вас исходное растровое изображение, с которого вы хотите начать. Типичный блок для меня выглядит как:

 Bitmap image = ...
Canvas c = new Canvas(image.isMutable()?image:image.copy(true));
...
  

Это предполагает, конечно, что вы не возражаете против искажения исходного растрового изображения (чего я обычно не делаю, но это ни в коем случае не универсально).