Glide图片框架使用详细介绍(三)自定义glide以及图片处理自定义transform

一、图片质量分类

安卓图片显示的质量配置主要分为四种:

ARGB_8888 :32位图,带透明度,每个像素占4个字节
ARGB_4444 :16位图,带透明度,每个像素占2个字节
RGB_565 :16位图,不带透明度,每个像素占2个字节
ALPHA_8 :32位图,只有透明度,不带颜色,每个像素占4个字节
(A代表透明度,RGB代表红绿蓝:即颜色)

图片默认质量

Picasso的默认质量是 ARGB_8888
Glide的默认质量则为 RGB_565

Glide默认的图片质量比Picasso稍微差一些。

加载一张4000 * 2000(一般手机拍摄的都超过这个像素)的图片

占用内存

Picasso需要占用的内存为: 32MB

4000 * 2000 * 4 / 1024 / 1024 = 30 (MB)

Glide需要占用的内存为: 16MB

4000 * 2000 * 2 / 1024 / 1024 = 15 (MB)

也就是说只要同时加载几张图片,你的应用就会OOM(内存溢出了),最恐怖的是就算你的ImageView的宽高只有10px,同样会占用那么多内存,这就是为什么需要做图片压缩的原因了

二、自定义glide

当然我们也能用glide加载更高清的图片,通过自定义glide实现。

1.创建一个类实现GlideModule

public class NewGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
       //TODO
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
       //TODO
    }
}

2.配置清单文件

在AndroidManifest中配置刚刚创建的GlideModule,需要在application节点下添加


    ...

    "com.xiayu.xiayuglidedemo.XiayuGlideModule"
        android:value="GlideModule" />

其中Android:name就是刚才创建的GlideModule的实现类

3.进行自定义配置

刚才创建的GlideModule的实现类时,会要实现两个方法,这里要用到的是其中的applyOptions方法,applyOptions方法里面提供了一个GlideBuilder,通过GlideBuilder我们就能实现自定义配置了

public class NewGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {

        builder.setDiskCache();//自定义磁盘缓存

        builder.setMemoryCache();//自定义内存缓存

        builder.setBitmapPool(); //自定义图片池

        builder.setDiskCacheService();//自定义本地缓存的线程池

        builder.setResizeService();//自定义核心处理的线程池

        builder.setDecodeFormat();//自定义图片质量

    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        //TO
    }
}

4.例子(配置默认图片质量)

由于Glide的配置涉及到的东西比较多,在以后的文章里面会对每一种配置做说明具体介绍,这里就先示范一个比较简单的配置,那就是图片质量配置

用过Picasso的朋友应该知道,Picasso默认的图片质量是ARGB_8888,而Glide默认的图片质量是RGB_565,这里我们就来修改默认配置,让Glide的默认质量为ARGB_8888

(ARGB_8888是指32位图,即每个像素占4byte)
(RGB_565是16位图,即每个像素占2byte)

public class NewGlideModule implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {

        //自定义图片质量
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);

    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        //TO
    }
}

5.其他

在清单文件中可以配置多个GlideModule,Glide会依次遍历并读取。

三、自定义Transformation

1.创建一个类继承BitmapTransformation

需要实现两个方法,其中transform方法里面能拿到bitmap对象,这里就是对图片做处理的地方

public  class CornersTransform extends BitmapTransformation {

        @Override
        protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            //TODO
        }



        @Override
        public String getId() {
           //TODO
        }
}

2.使用

通过调用transform方法就能展示处理后的图片

Glide.with(this).load(url).transform(new CornersTransform()).into(iv1);

3.举例(圆角处理)

3.1 自定义Transformation

public  class CornersTransform extends BitmapTransformation {
    private float radius;

    public CornersTransform(Context context) {
        super(context);
        radius = 10;
    }

    public CornersTransform(Context context, float radius) {
        super(context);
        this.radius = radius;
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return cornersCrop(pool, toTransform);
    }

    private Bitmap cornersCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint  paint  = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

3.2 使用

Glide.with(this).load(url).transform(newCornersTransform(this,50)).into(iv1);

4.使用多个transform

transform方法是不支持多次调用的,如果你调用了两次,那么第二次的会覆盖了第一次的效果

但是他有一个重载的方法可以传入多个对象,这样传入的变形器都能够生效

Glide.with(this).load(url).transform(new CircleTransform(this),new CornersTransform(this,50)).into(iv1);

5.三方库

如果你觉得自己自定义transform比较困难,或者你想学习别人的图片处理方法,可以在试一试github上的这个三方库

Glide Transformations

https://github.com/wasabeef/glide-transformations

效果(支持圆角,高斯模糊等)

你可能感兴趣的:(图片处理)