Получить 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() {

    }
});

Надеюсь, он поможет вам