Android объединяет два изображения - PullRequest
1 голос
/ 04 августа 2011

Я хочу объединить два изображения и затем сохранить их на Android SDCard. Один из камеры и один из папки ресурсов.Проблема в том, что я получаю эту ошибку: Причина: java.lang.IllegalStateException: Неизменяемое растровое изображение передается в конструктор Canvas.Спасибо.

        Bitmap bottomImage = BitmapFactory.decodeResource(getResources(),R.drawable.blink);
        Bitmap topImage = (Bitmap) data.getExtras().get("data");  

        // As described by Steve Pomeroy in a previous comment, 
        // use the canvas to combine them.
        // Start with the first in the constructor..
        Canvas comboImage = new Canvas(bottomImage);
        // Then draw the second on top of that
        comboImage.drawBitmap(topImage, 0f, 0f, null);

        // bottomImage is now a composite of the two. 

        // To write the file out to the SDCard:
        OutputStream os = null;

        try {
            os = new FileOutputStream("/sdcard/DCIM/Camera/" + "myNewFileName.png");
            bottomImage.compress(CompressFormat.PNG, 50, os);

            //Bitmap image.compress(CompressFormat.PNG, 50, os);
        } catch(IOException e) {
            Log.v("error saving","error saving");
            e.printStackTrace();
        }

Удалось исправить это, просто выполнив это изменение:

        int w = bottomImage.getWidth();
        int h = bottomImage.getHeight(); 
        Bitmap new_image = Bitmap.createBitmap(w, h ,bottomImage.getConfig());

Теперь проблема в том, что он не сохраняет изображение.Ты знаешь почему?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Это поможет вам =)


Редактировать: (вставлять ответ по ссылке)

единственный статический конструктор для Bitmap, возвращающий изменяемый:

(Class: Bitmap) общедоступная статическая битовая карта createBitmap (int width, int высота, логическое имеет альфа) * ​​1013 * Возвращает: изменяемое растровое изображение с указанными шириной и высотой.

  • Так что вы можете работать с getPixels / setPixels или как это:

    Bitmap bitmapResult = bm.createBitmap(widthOfOld, heightOfOld, hasAlpha);
    Canvas c = new Canvas();
    c.setDevice(bitmapResult); // drawXY will result on that Bitmap
    c.drawBitmap(bitmapOld, left, top, paint);
    
  • как получить Drawable из Bitmap: используя BitmapDrawable-Subclass, который расширяет Drawable, вот так:

    Bitmap myBitmap = BitmapFactory.decode(path);
    Drawable bd = new BitmapDrawable(myBitmap);
    
1 голос
/ 04 августа 2011

bitmap, который вы получаете, является неизменным , что означает, что его нельзя изменить.Хотя на странице Canvas не указывается, что конструктору требуется растровое изображение mutable, оно делает это.

Чтобы создать растровое изображение mutable, вы можете использовать thisметод .

...