В настоящее время я использую Picasso и OkHttp для кэширования растровых изображений. Что я хочу сделать, так это получить конкретное кэшированное растровое изображение, нарисовать его, а затем поместить это нарисованное на растровое изображение обратно в память и дисковый кеш. Моя реализация довольно стандартна, я просто использую Target и добавляю загруженное растровое изображение в пользовательский ImageView, который находится в GridView. Я искал вокруг, и я не могу найти способ сделать это. Поддерживают ли эти библиотеки что-то подобное?
Обновление/изменение кэшированного растрового изображения с помощью Picasso и OkHttp
Ответы (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 на сервере).
Попробуйте использовать преобразование Пикассо.
рабочий процесс Пикассо выглядит так:
- получить изображение из сети
- кэшировать необработанное изображение в памяти/кеше
- применить необязательные преобразования и кэшировать эти результаты
Так что в вашем случае вам нужно будет сделать пользовательское преобразование, которое изменяет ваше растровое изображение. Во второй раз, когда вы запрашиваете растровое изображение с этим конкретным преобразованием, оно будет загружено из кеша.
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);