Обновление/изменение кэшированного растрового изображения с помощью Picasso и OkHttp

В настоящее время я использую Picasso и OkHttp для кэширования растровых изображений. Что я хочу сделать, так это получить конкретное кэшированное растровое изображение, нарисовать его, а затем поместить это нарисованное на растровое изображение обратно в память и дисковый кеш. Моя реализация довольно стандартна, я просто использую Target и добавляю загруженное растровое изображение в пользовательский ImageView, который находится в GridView. Я искал вокруг, и я не могу найти способ сделать это. Поддерживают ли эти библиотеки что-то подобное?


person Papajohn000    schedule 28.04.2014    source источник


Ответы (2)


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

Я бы сказал, что вы все еще можете использовать Picasso для загрузки изображения, если хотите, но когда вы получаете растровое изображение, ваше приложение сохраняет его измененную версию. Поэтому, когда пользователь заканчивает рисовать его, вы должны сохранить его локально в файл самостоятельно (если это большое изображение, вы также можете создать отдельные миниатюры меньшего размера для GridView) и использовать эту версию. Чтобы сохранить измененное содержимое Bitmap в файл, вы можете вызвать

outBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);

Вы также можете загружать локальные файлы в свой GridView с помощью Picasso: Picasso.with(context).load("fileUrl").into(mImageView);. Таким образом, в вашем коде вы должны проверить, есть ли у вас локальная отредактированная версия, и загрузить ее из локального файла с помощью Picasso или загрузить ее с сервера с помощью Picasso в противном случае.

Если вы хотите сохранить изображение на сервере, вы можете отправить его на сервер после того, как пользователь отредактировал его. Затем Picasso+OkHttp загрузит его снова (при условии, что вы обновили атрибуты HTTP-кеша, такие как ETag на сервере).

person EvilDuck    schedule 06.05.2014
comment
Итак, вы говорите, что сохраните отредактированные растровые изображения где-то еще, кроме дискового кеша, используемого OkHttp/Picasso. Затем просто проверьте, обновлено ли растровое изображение в этой позиции. Если оно загружено из альтернативного локального файла? - person Papajohn000; 07.05.2014
comment
Я бы сделал что-то подобное, да. - person EvilDuck; 07.05.2014

Попробуйте использовать преобразование Пикассо.

рабочий процесс Пикассо выглядит так:

  1. получить изображение из сети
  2. кэшировать необработанное изображение в памяти/кеше
  3. применить необязательные преобразования и кэшировать эти результаты

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

public class YourTransformation implements com.squareup.picasso.Transformation {

    @Override
    public Bitmap transform ( final Bitmap source ) {
        final Paint paint = new Paint();

        Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        // DO YOUR DRAWING STUFF ON CANVAS

        if (source != output) {
            source.recycle();
        }

        return output;
     }

     @Override
     public String key () {
         return "customTransformation" + SOME_UNIQUE_IDENTIFIER 
     }
}

Не забудьте переопределить метод key(), так как picasso использует его для создания записи в кэше.

В своем коде вы можете просто использовать его с обычным запросом picasso:

picasso.load(url).transform(new YourTransformation()).into(imageView);
person JimVanB    schedule 05.05.2014
comment
Пользователь будет рисовать на нем, и он будет рисовать на нем потенциально несколько раз. Так что я не знаю, как это будет нарисовано. - person Papajohn000; 06.05.2014