Glideを使うと、URLをImageView
にダウンロードするのはとても簡単です。
Glide
.with(context)
.load(getIntent().getData())
.placeholder(R.drawable.ic_loading)
.centerCrop()
.into(imageView);
私もBitmap
にダウンロードできるかどうか疑問に思いますか?生のビットマップにダウンロードしたいのですが、それを他のツールを使って操作することができます。私はコードを見てきましたが、その方法がわかりません。
あなたが 最新バージョン にいることを確認してください
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
はまだビットマップを使用していないことを確認している限り使用できます。
私はGlideに慣れていませんが、目標サイズを知っていれば、次のように使用できます。
Bitmap theBitmap = Glide.
with(this).
load("http://....").
asBitmap().
into(100, 100). // Width and height
get();
-1,-1
を渡してフルサイズの画像を取得できるようです(純粋にテストに基づいています。文書化されているのを見ることはできません)。
注意into(int,int)
はFutureTarget<Bitmap>
を返すので、これをExecutionException
とInterruptedException
をカバーする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>()
を使用してください。
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);
}
});
これは私のために働いたものです: 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());
}
});
}
});
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
では使用できませんSimpleTarget<Bitmap>
これが解決策です
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;
}
}
動的ビットマップ画像をビットマップ変数に割り当てたい場合
kotlin
の例
backgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();
上記の答えは私にはうまくいきませんでした
.asBitmap
は.load("http://....")
の前にあるべきです
@ 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を使用しない