Редактирование растрового изображения в Android 2.3 - PullRequest
0 голосов
/ 21 марта 2012

Я делаю простое приложение для рисования на Android. Я использую FingerPaint.java, предоставляемый с примером ApiDemos, в качестве основы, добавляя некоторые функции и избавляясь от других. Он в основном создает холст с растровым изображением, которое можно рисовать сверху.

Я добавил функции «открыть» и «сохранить». Функция «сохранить» сохраняет растровое изображение в файле с помощью функции getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), а функция «open» запускает startActivityForResult (photoPickerIntent, 1) и загружает выбранное изображение.

Проблема в том, что я не могу нарисовать растровое изображение, которое я открыл вручную. При рисовании пальцем отображается след, но как только палец снят с экрана, след исчезает. Если я сохраню это растровое изображение, оно будет отображаться в галерее без изменений. Но при запуске приложения я могу отлично рисовать на холсте.

Я почти уверен, что это очень простая проблема из-за моего непонимания того, как работают Canvas и Bitmap. В любом случае, вот мой код.

При создании моего пользовательского представления:

    public MyView(Context c){

        super(c);

        mBitmap = Bitmap.createBitmap(480, 800, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

    }

Переопределение OnDraw:

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(0xFFAAAAAA);
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        canvas.drawPath(mPath, mPaint);
    }

Моя "открытая" функция:

    private void open(){
    //checkSD: 1 if read only, 2 if RW
    if(checkSD()==1 || checkSD()==2){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, 1);
    }
}

И, наконец, мой onActivityResult:

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //RequestCode:1 image
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImage = data.getData();
            try{
                InputStream fIn = getContentResolver().openInputStream(selectedImage);
                mBitmap = BitmapFactory.decodeStream(fIn);
                fIn.close();
            } catch (Exception e){
                e.printStackTrace();
            }

        }
    }
}

Я думаю, что моя ошибка в этом коде, но если кто-то думает, что это может быть так, как я на самом деле рисую, я не модифицировал touch_xxx и onTouchEvent из примера FingerPaint.java, так что вы можете взглянуть на это (или попросите меня опубликовать это здесь, если вы по какой-то причине не видите его).

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Хорошо, решил это!

Я сделал 2 вещи.Первая добавляла следующую строку сразу после "fIn.close ();"внутри onActivityResult:

mCanvas = new Canvas(mBitmap);

Я до сих пор не совсем уверен, почему это необходимо, но я знаю, что без этой строки это не работает.

Второе, что я сделал, было копированиерастровое изображение я загружал.Оказывается, что BitmapFactory.decodeStream () возвращает неизменяемое растровое изображение, и для создания нового холста требуется изменяемое растровое изображение.Я нашел хорошее объяснение в этом сообщении в блоге:

http://sudarnimalan.blogspot.com.es/2011/09/android-convert-immutable-bitmap-into.html

Я использовал второй метод, который копирует растровое изображение в новый, например:

mBitmap = mBitmap.copy(Config.ARGB_8888, true);

Я знаю из поста, что это не безопасный метод, но на данный момент он работает.

Если бы я использовал «неизменяемое растровое изображение» в своем поиске, я бы придумал ответ:себя.В любом случае, спасибо!

0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...