web-dev-qa-db-ja.com

Picassoで読み込まれたImageViewからビットマップを取得する

サーバーで画像を探す前に画像が読み込まれていない場合、画像を読み込む方法がありました。次に、それをアプリのファイルシステムに保存します。ファイルシステムにある場合は、サーバーからイメージをプルするよりもはるかに高速であるため、代わりにそのイメージをロードします。以前にアプリを閉じずに画像を読み込んだ場合、それは静的辞書に保存されるため、メモリを使い果たすことなく再読み込みして、メモリ不足エラーを回避できます。

Picasso画像読み込みライブラリを使い始めるまで、これはすべてうまくいきました。今私はImageViewに画像をロードしていますが、返されたビットマップを取得してファイルまたは静的辞書に保存できるようにする方法がわかりません。これは物事をより困難にしました。それは毎回サーバーからイメージをロードしようとすることを意味するからです、それは私が起こりたくないことです。 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);
    }
}

どんな助けでも大歓迎です、ありがとう!

10
shadowarcher

ピカソを使用すると、自動的に行われるため、独自の静的辞書を実装する必要はありません。 @intrepidkarthiは、画像が最初にロードされたときにPicassoによって自動的にキャッシュされるため、常にサーバーを呼び出して同じ画像を取得するわけではないという意味で正しかったです。

そうは言っても、同じような状況に陥っていました。アプリケーションの別の場所にビットマップを保存するために、ダウンロードしたビットマップにアクセスする必要がありました。そのために、@ Gilad Haimovの回答を少し調整しました。

Java、古いバージョンの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) {}
});

Kotlin、バージョン2.71828のPicasso:

Picasso.get()
        .load(url)
        .into(object : Target {

            override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
                /* Save the bitmap or do something with it here */

                // Set it in the ImageView
                theView.setImageBitmap(bitmap)
            }

            override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}

            override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {}

        })

これにより、非同期にロードしながら、ロードされたビットマップにアクセスできます。自動的に行われなくなるため、ImageViewで設定することを忘れないでください。

ちなみに、画像の出所を知りたい場合は、同じ方法でその情報にアクセスできます。上記のメソッドの2番目の引数Picasso.LoadedFrom fromは、ビットマップのロード元のソースを知ることができる列挙型です(3つのソースはDISKMEMORY、およびNETWORKです。( ソース )。Square Inc.は、説明されたデバッグインジケーターを使用して、ビットマップがどこから読み込まれたかを視覚的に確認する方法も提供します こちら

お役に立てれば !

41
jguerinet

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();
    }
}
8
Gilad Haimov

この例では、折りたたみツールバーの背景を設定するために使用しました。

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());

}

お役に立てば幸いです。

0

あなたはピカソを使用しているので、それを最大限に活用したいと思うかもしれません。強力なキャッシングメカニズムが含まれています。

Picassoインスタンスでpicasso.setDebugging(true)を使用して、発生するキャッシュの種類を確認します(ディスク、メモリ、またはネットワークから画像が読み込まれます)。参照: http://square.github.io/picasso/ (デバッグインジケーター)

Picassoのデフォルトのインスタンスは( http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-Android.content.Context- )で構成されています

使用可能なアプリケーションRAMの15%のLRUメモリキャッシュ

2%のストレージスペースのディスクキャッシュ。最大50MBですが、5MB以上です。 (注:これは、API 14以降、またはOkHttpなどのすべてのAPIレベルでディスクキャッシュを提供するスタンドアロンライブラリを使用している場合にのみ使用できます)

また、Picasso.Builderを使用してCacheインスタンスを指定し、インスタンスをカスタマイズしたり、Downloaderを指定してより細かく制御したりすることもできます。 (ピカソにはOkDownloaderの実装があり、アプリにOkHttpを含めると自動的に使用されます。)

0
njzk2