Glide4.x 图片高斯模糊

图1. 效果图
Glide
    .with(this)
    .load("https://i0.hdslb.com/bfs/archive/13e279a33a1726cf63d6c1bb267a36a1b005c4e6.jpg")
    .into(ivOriginal)

Glide
    .with(this)
    .load("https://i0.hdslb.com/bfs/archive/13e279a33a1726cf63d6c1bb267a36a1b005c4e6.jpg")
    .apply(RequestOptions.bitmapTransform(GlideBlurTransformation(this)))
    .into(ivBlur)

对比上面的代码,模糊的效果多设置了一个 , 代码如下:

public class GlideBlurTransformation extends CenterCrop {
    private Context context;

    public GlideBlurTransformation(Context context) {
        this.context = context;
    }

    @Override
    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
        Bitmap bitmap = super.transform(pool, toTransform, outWidth, outHeight);
        return BlurBitmapUtil.getInstance().blurBitmap(context, bitmap, 25, (int) (outWidth * 0.5), (int) (outHeight * 0.5));
    }

    @Override
    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
    }
}

  GlideBlurTransformation 继承自 Glide 的 ,原因是 Glide4 设置的option的transform会覆盖,例如下面设置的两个 transform,只有 CenterCrop会生效;(当然,如果项目中想要其他的显示效果,改下继承的 BitmapTransformation 就好了)

Glide
    .with(this)
    .load("https://i0.hdslb.com/bfs/archive/13e279a33a1726cf63d6c1bb267a36a1b005c4e6.jpg")
    .apply(RequestOptions()
        .transform(GlideBlurTransformation(this))
        .transform(CenterCrop()))
    .into(ivBlur)

  GlideBlurTransformation 中的 方法,首先通过super.transform 拿到 centerCrop 效果之后的 Bitmap,然后调用工具类进行模糊;其中25是模糊的半径(1-25之间),后面两个参数是模糊后的图片输出尺寸,尺寸越小,也会越模糊,下面是按照原比例输出的效果,可以和上图进行对比

图2. 原比例输出的模糊效果

  最后贴上模糊的方法

/**
* @param image         需要模糊的图片
* @param blurRadius    模糊的半径(1-25之间)
* @return 模糊处理后的Bitmap
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public Bitmap blurBitmap(Context context, Bitmap image, float blurRadius, int outWidth, int outHeight) {
    // 将缩小后的图片做为预渲染的图片
    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, outWidth, outHeight, false);
    // 创建一张渲染后的输出图片
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
    // 创建RenderScript内核对象
    RenderScript rs = RenderScript.create(context);
    // 创建一个模糊效果的RenderScript的工具对象
    ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间
    // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去
    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
    // 设置渲染的模糊程度, 25f是最大模糊度
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        blurScript.setRadius(blurRadius);
    }
    // 设置blurScript对象的输入内存
    blurScript.setInput(tmpIn);
    // 将输出数据保存到输出内存中
    blurScript.forEach(tmpOut);
    // 将数据填充到Allocation中
    tmpOut.copyTo(outputBitmap);
    return outputBitmap;
}



你可能感兴趣的:(Glide4.x 图片高斯模糊)