Glide4.x 图片高斯模糊

2019-03-09  本文已影响0人  JinYx
图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)

对比上面的代码,模糊的效果多设置了一个 \color{#00AA00}{transform}, 代码如下:

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 的 \color{#DD0000}{com.bumptech.glide.load.resource.bitmap.CenterCrop},原因是 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 中的 \color{#00AA00}{transform} 方法,首先通过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;
}


补充:Android Studio 模拟器配置网络

  cd 进入 Android SDK 的 emulator 目录下,然后执行如下指令启动模拟器, Nexus_5X_API_27 对应需要配置的模拟器的名字; 麻烦的是配置是一次性的,下次启动又需要重新执行

emulator -avd Nexus_5X_API_27 -dns-server 8.8.8.8,114.114.114.114

  如果不确定名字是什么,可以去.android/avd 目录下查看


图3. 模拟器avd目录
上一篇下一篇

猜你喜欢

热点阅读