学而实习之 不亦乐乎

Glide 获取 Bitmap 的全方位讲解

2023-10-06 12:53:59

一、Glide 获取 Bitmap

使用Glide获取Bitmap是非常容易的,只需要通过Glide.with().asBitmap()方法加载图片即可:

Glide.with(context)
     .load(url)
     .asBitmap()
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            //bitmap已经加载完成,可以对其进行操作
         }
     });

通过这种方式,Glide会自动帮我们将网络图片或本地图片转换成Bitmap,并且会缓存该Bitmap以供下次快速加载。

二、Glide获取图片

除了获取Bitmap之外,我们还可以通过Glide获取图片,方法与获取Bitmap类似,只需要将 asBitmap() 方法换成 asDrawable() 即可:

Glide.with(context)
     .load(url)
     .asDrawable()
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) {
            //图片已经加载完成,可以对其进行操作
         }
     });

三、Glide获取视频第一帧

同样地,我们可以使用Glide获取视频的第一帧图像:

Glide.with(context)
     .load(url)
     .asBitmap()
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            //视频第一帧图像已经加载完成,可以对其进行操作
         }
     });

需要注意的是,在使用Glide获取视频第一帧时,最好将diskCacheStrategy()设置为ALL,这样才能使Glide顺利地获取视频缩略图。

四、Glide获取缩略图有点慢

如果我们只需要一张图片的缩略图,那么使用上述的方法可能会有点慢,因为Glide会将整张图片加载完后再生成缩略图。此时,我们可以使用thumbnail()方法来快速获取缩略图:

Glide.with(context)
     .load(url)
     .thumbnail(0.1f)
     .into(new SimpleTarget<Bitmap>() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            //缩略图已经加载完成,可以对其进行操作
         }
     });

在上述代码中,thumbnail()方法的参数0.1f表示缩略图大小为原图的1/10。

五、Glide获取图片宽高

有时候,我们需要获取图片的宽高信息,以便后续的操作。这可以通过BitmapFactory.Options对象来实现:

Glide.with(context)
     .load(url)
     .asBitmap()
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            int width = resource.getWidth();
            int height = resource.getHeight();
            //获取图片的宽高信息
         }
     });

六、Glide获取一级缓存

除了网络或本地图片外,Glide还会缓存在内存中。Glide缓存在内存中的图片称为一级缓存。可以使用MemoryCacheKey类来获取:

Glide.with(context)
     .load(url)
     .asBitmap()
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            MemoryCacheKey key = new MemoryCacheKey(new GlideUrl(url), EmptySignature.obtain());
            Bitmap bitmap = memoryCache.get(key);
         }
     });

其中,memoryCache为Glide内部的一级缓存对象。如果你需要获取一级缓存之外的缓存,可以使用DiskLruCache。

七、Glide获取不到文件缩略图

当我们使用Glide获取本地图片的缩略图时,可能会出现获取不到缩略图的情况。解决方法是在placeholder()方法中设置一个空白图像,这样Glide会强制生成缩略图:

Glide.with(context)
     .load(new File(file))
     .placeholder(R.color.transparent)
     .thumbnail(0.1f)
     .into(new SimpleTarget<Bitmap>() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            //缩略图已经加载完成,可以对其进行操作
         }
     });

八、Glide获取Drawable

有时候,我们只需要获取Drawable而不是Bitmap或图片。这可以通过asDrawable()方法来实现:

Glide.with(context)
     .load(url)
     .asDrawable()
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Drawable resource, GlideAnimation glideAnimation) {
            //获取到Drawable对象,可以对其进行操作
         }
     });

九、Glide获取视频第一帧子线程

默认情况下,Glide会在主线程中执行,如果我们需要在子线程中获取视频第一帧图像,可以使用into()方法的另一个重载,指定Handler即可:

Glide.with(context)
     .load(url)
     .asBitmap()
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .into(new SimpleTarget() {

         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            //视频第一帧图像已经加载完成,可以对其进行操作
         }
     }, new Handler(Looper.getMainLooper()));