web-dev-qa-db-ja.com

画像をビットマップにダウンロードするのにどのようにグライドを使うのですか?

Glideを使うと、URLをImageViewにダウンロードするのはとても簡単です。

Glide
   .with(context)
   .load(getIntent().getData())
   .placeholder(R.drawable.ic_loading)
   .centerCrop()
   .into(imageView);

私もBitmapにダウンロードできるかどうか疑問に思いますか?生のビットマップにダウンロードしたいのですが、それを他のツールを使って操作することができます。私はコードを見てきましたが、その方法がわかりません。

105
JohnnyLambada

あなたが 最新バージョン にいることを確認してください

implementation 'com.github.bumptech.glide:glide:4.9.0'

コトリン:

Glide.with(this)
        .asBitmap()
        .load(imagePath)
        .into(object : CustomTarget<Bitmap>(){
            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                imageView.setImageBitmap(resource)
            }
            override fun onLoadCleared(placeholder: Drawable?) {
                // this is called when imageView is cleared on lifecycle call or for
                // some other reason.
                // if you are referencing the bitmap somewhere else too other than this imageView
                // clear it here as you can no longer have the bitmap
            }
        })

ビットマップサイズ:

元のサイズの画像を使用したい場合は上記のようにデフォルトのコンストラクタを使用し、それ以外の場合はビットマップに希望のサイズを渡すことができます。

into(object : CustomTarget<Bitmap>(1980, 1080)

Java:

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new CustomTarget<Bitmap>() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
            }
        });

古い答え:

compile 'com.github.bumptech.glide:glide:4.8.0'以下で

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }
        });

compile 'com.github.bumptech.glide:glide:3.7.0'以下の場合

Glide.with(this)
        .load(path)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                imageView.setImageBitmap(resource);
            }
        });

SimpleTarget is deprecatedという警告が表示されるかもしれません

理由:

SimpleTargetを非推奨にすることの主なポイントは、GlideのAPI契約を破るように誘惑する方法についてあなたに警告することです。具体的には、SimpleTargetがクリアされた後にロードしたリソースの使用を強制的に停止させることは何もしません。これはクラッシュやグラフィックの破損を招く可能性があります。

ImageViewがいったんクリアされたら、SimpleTargetはまだビットマップを使用していないことを確認している限り使用できます。

89
Max

私はGlideに慣れていませんが、目標サイズを知っていれば、次のように使用できます。

Bitmap theBitmap = Glide.
        with(this).
        load("http://....").
        asBitmap().
        into(100, 100). // Width and height
        get();

-1,-1を渡してフルサイズの画像を取得できるようです(純粋にテストに基づいています。文書化されているのを見ることはできません)。

注意into(int,int)FutureTarget<Bitmap>を返すので、これをExecutionExceptionInterruptedExceptionをカバーするtry-catchブロックでラップする必要があります。これがより完全な実装例で、テスト済みで動作しています。

class SomeActivity extends Activity {

    private Bitmap theBitmap = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // onCreate stuff ...
        final ImageView image = (ImageView) findViewById(R.id.imageView);

        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                Looper.prepare();
                try {
                    theBitmap = Glide.
                        with(SomeActivity.this).
                        load("https://www.google.es/images/srpr/logo11w.png").
                        asBitmap().
                        into(-1,-1).
                        get();
                 } catch (final ExecutionException e) {
                     Log.e(TAG, e.getMessage());
                 } catch (final InterruptedException e) {
                     Log.e(TAG, e.getMessage());
                 }
                 return null;
            }
            @Override
            protected void onPostExecute(Void dummy) {
                if (null != theBitmap) {
                    // The full bitmap should be available here
                    image.setImageBitmap(theBitmap);
                    Log.d(TAG, "Image loaded");
                };
            }
        }.execute();
    }
}

以下のコメントでMonkeylessの提案に従って(そして これも公式な方法であるように思われます )、コードをかなり単純化するためにオプションでoverride(int,int)と組み合わせたSimpleTargetを使うことができます。ただし、この場合は正確なサイズを指定する必要があります(1未満のものは受け入れられません)。

Glide
    .with(getApplicationContext())
    .load("https://www.google.es/images/srpr/logo11w.png")
    .asBitmap()
    .into(new SimpleTarget<Bitmap>(100,100) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            image.setImageBitmap(resource); // Possibly runOnUiThread()
        }
    });

@hennryで示唆されているように、同じ画像が必要な場合はnew SimpleTarget<Bitmap>()を使用してください。

171
outlyer

TargetクラスまたはBitmapImageViewTargetのような実装の1つをオーバーライドし、setResourceメソッドをオーバーライドしてビットマップをキャプチャするのが良い方法かもしれません。

これはテストされていません。 :-)

    Glide.with(context)
         .load("http://goo.gl/h8qOq7")
         .asBitmap()
         .into(new BitmapImageViewTarget(imageView) {
                     @Override
                     protected void setResource(Bitmap resource) {
                         // Do bitmap magic here
                         super.setResource(resource);
                     }
         });
15
blad

これは私のために働いたものです: https://github.com/bumptech/glide/wiki/Custom-targets#overriding-default-behavior

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.request.target.BitmapImageViewTarget;

...

Glide.with(yourFragment)
  .load("yourUrl")
  .asBitmap()
  .into(new BitmapImageViewTarget(yourImageView) {
    @Override
    public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> anim) {
        super.onResourceReady(bitmap, anim);
        Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {  
            @Override
            public void onGenerated(Palette palette) {
                // Here's your generated palette
                Palette.Swatch swatch = palette.getDarkVibrantSwatch();
                int color = palette.getDarkVibrantColor(swatch.getTitleTextColor());
            }
        });
    }
});
7
Stephen Kaiser

UPDATE

今度は Custom Targets を使う必要があります

サンプルコード

    Glide.with(mContext)
            .asBitmap()
            .load("url")
            .into(new CustomTarget<Bitmap>() {
                @Override
                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {

                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {
                }
            });

画像をビットマップにダウンロードするのにどのようにグライドを使うのですか?

上記のすべての答えは正しいですが古くなっています

新しいバージョンのGlide implementation 'com.github.bumptech.glide:glide:4.8.0'では

あなたはコードの下のエラーを見つけるでしょう

  • .asBitmap()glide:4.8.0では使用できません

enter image description here

  • SimpleTarget<Bitmap> 廃止予定です

enter image description here

これが解決策です

import Android.graphics.Bitmap;
import Android.graphics.Canvas;
import Android.graphics.drawable.BitmapDrawable;
import Android.graphics.drawable.Drawable;
import Android.support.annotation.NonNull;
import Android.support.annotation.Nullable;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.Request;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;



public class MainActivity extends AppCompatActivity {

    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = findViewById(R.id.imageView);

        Glide.with(this)
                .load("")
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
                .into(new Target<Drawable>() {
                    @Override
                    public void onLoadStarted(@Nullable Drawable placeholder) {

                    }

                    @Override
                    public void onLoadFailed(@Nullable Drawable errorDrawable) {

                    }

                    @Override
                    public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {

                        Bitmap bitmap = drawableToBitmap(resource);
                        imageView.setImageBitmap(bitmap);
                        // now you can use bitmap as per your requirement
                    }

                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {

                    }

                    @Override
                    public void getSize(@NonNull SizeReadyCallback cb) {

                    }

                    @Override
                    public void removeCallback(@NonNull SizeReadyCallback cb) {

                    }

                    @Override
                    public void setRequest(@Nullable Request request) {

                    }

                    @Nullable
                    @Override
                    public Request getRequest() {
                        return null;
                    }

                    @Override
                    public void onStart() {

                    }

                    @Override
                    public void onStop() {

                    }

                    @Override
                    public void onDestroy() {

                    }
                });

    }

    public static Bitmap drawableToBitmap(Drawable drawable) {

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        int width = drawable.getIntrinsicWidth();
        width = width > 0 ? width : 1;
        int height = drawable.getIntrinsicHeight();
        height = height > 0 ? height : 1;

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);

        return bitmap;
    }
}
5
Nilesh Rathod

動的ビットマップ画像をビットマップ変数に割り当てたい場合

kotlinの例

backgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();

上記の答えは私にはうまくいきませんでした

.asBitmap.load("http://....")の前にあるべきです

2
ramana vv

@ outlyerの答えは正しいですが、新しいGlideバージョンにはいくつかの変更があります

私のバージョン:4.7.1

コード:

 Glide.with(context.applicationContext)
                .asBitmap()
                .load(iconUrl)
                .into(object : SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
                    override fun onResourceReady(resource: Bitmap, transition: com.bumptech.glide.request.transition.Transition<in Bitmap>?) {
                        callback.onReady(createMarkerIcon(resource, iconId))
                    }
                })

注:このコードはUIスレッドで実行されるので、並行性を保つためにAsyncTask、Executor、またはその他の方法を使用できます(元のサイズを取得したい場合は、Target.SIZE_ORIGINAを私のコードとして使用します)。 -1、-1を使用しない

2