Получить Bitmap из ImageView, загруженного Picasso
У меня был метод загрузки изображений, если изображение не было загружено до того, как оно будет искать его на сервере. Затем он хранит его в файловой системе приложений. Если он находится в файловой системе, он загружает это изображение, поскольку это намного быстрее, чем вытягивание изображений с сервера. Если вы загрузили изображение без закрытия приложения, оно будет храниться в статическом словаре, чтобы его можно было перезагрузить, не используя больше памяти, чтобы избежать ошибок в памяти.
Все это работало нормально, пока я не начал использовать библиотеку загрузки изображений Picasso. Теперь я загружаю изображения в ImageView, но я не знаю, как получить Bitmap, который возвращается, чтобы я мог хранить его в файле или статическом словаре. Это усложнило ситуацию. потому что это означает, что он пытается загружать изображение с сервера каждый раз, чего я не хочу. Есть ли способ получить Bitmap после загрузки его в ImageView? Ниже мой код:
public Drawable loadImageFromWebOperations(String url,
final String imagePath, ImageView theView, Picasso picasso) {
try {
if (Global.couponBitmaps.get(imagePath) != null) {
scaledHeight = Global.couponBitmaps.get(imagePath).getHeight();
return new BitmapDrawable(getResources(),
Global.couponBitmaps.get(imagePath));
}
File f = new File(getBaseContext().getFilesDir().getPath()
.toString()
+ "/" + imagePath + ".png");
if (f.exists()) {
picasso.load(f).into(theView);
**This line below was my attempt at retrieving the bitmap however
it threw a null pointer exception, I assume this is because it
takes a while for Picasso to add the image to the ImageView**
Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap();
Global.couponBitmaps.put(imagePath, bitmap);
return null;
} else {
picasso.load(url).into(theView);
return null;
}
} catch (OutOfMemoryError e) {
Log.d("Error", "Out of Memory Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
} catch (NullPointerException e) {
Log.d("Error", "Null Pointer Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
}
}
Любая помощь будет принята с благодарностью, спасибо!
Ответы
Ответ 1
С Picasso вам не нужно реализовывать свой собственный статический словарь, потому что он выполняется автоматически для вас. @intrepidkarthi был прав в том смысле, что изображения автоматически кэшируются Picasso при первом загрузке, поэтому он не постоянно вызывает сервер для получения того же изображения.
Сказав это, я оказался в аналогичной ситуации: мне нужно было получить доступ к растровому изображению, которое было загружено, чтобы сохранить его где-то еще в моем приложении. Для этого я немного подправил @Гилада Хаймова немного:
Picasso.with(this)
.load(url)
.into(new Target() {
@Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) {
/* Save the bitmap or do something with it here */
//Set it in the ImageView
theView.setImageBitmap(bitmap);
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}
@Override
public void onBitmapFailed(Drawable errorDrawable) {}
});
Это дает вам доступ к загруженному растровому изображению во время его асинхронной загрузки. Вы просто должны помнить, чтобы установить его в ImageView, поскольку он больше не будет автоматически выполнен для вас.
С другой стороны, если вам интересно узнать, откуда идет ваш образ, вы можете получить доступ к этой информации в том же методе. Второй аргумент вышеуказанного метода Picasso.LoadedFrom from
- это перечисление, которое позволяет вам узнать, из какого источника был загружен битмап (три источника: DISK
, MEMORY
и NETWORK
. ( Source). Square Inc. также предоставляет визуальный способ увидеть, откуда была загружена битмап, с помощью индикаторов отладки, объясненных .
Надеюсь, это поможет!
Ответ 2
Picasso дает вам прямой контроль над загруженными изображениями. Чтобы сохранить загруженные изображения в файл, выполните следующие действия:
Picasso.with(this)
.load(currentUrl)
.into(saveFileTarget);
Где:
saveFileTarget = new Target() {
@Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH);
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 75, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
Ответ 3
Поскольку вы используете Picasso, вы также можете полностью использовать его. Он включает мощный механизм кэширования.
Используйте picasso.setDebugging(true)
на вашем экземпляре Picasso
, чтобы узнать, какое кэширование происходит (изображения загружаются с диска, памяти или сети). Смотрите: http://square.github.io/picasso/ (индикаторы отладки)
Экземпляр Picasso по умолчанию настроен с помощью http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-)
Кэш памяти LRU составляет 15% доступного ОЗУ приложения.
Кэш-память емкостью 2% памяти до 50 МБ, но не менее 5 МБ. (Примечание: это доступно только для API 14+ или если вы используете автономную библиотеку, которая обеспечивает кеш диска на всех уровнях API, таких как OkHttp)
Вы также можете указать свой экземпляр Cache
, используя Picasso.Builder
, чтобы настроить свой экземпляр, и вы можете указать свой Downloader
для более тонкого управления. (В Picasso реализована реализация OkDownloader
, которая автоматически используется, если вы включили OkHttp
в свое приложение.)
Ответ 4
В этом примере я использовал настройку фоновой панели.
public class MainActivity extends AppCompatActivity {
CollapsingToolbarLayout colapsingToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar);
ImageView imageView = new ImageView(this);
String url ="www.yourimageurl.com"
Picasso.with(this)
.load(url)
.resize(80, 80)
.centerCrop()
.into(image);
colapsingToolbar.setBackground(imageView.getDrawable());
}
Надеюсь, это помогло вам.
Ответ 5
Используйте этот
Picasso.with(context)
.load(url)
.into(imageView new Callback() {
@Override
public void onSuccess() {
//use your bitmap or something
}
@Override
public void onError() {
}
});
Надеюсь, он поможет вам