美文网首页
Glide4.x 图片高斯模糊

Glide4.x 图片高斯模糊

作者: JinYx | 来源:发表于2019-03-09 15:33 被阅读0次
    图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目录

    相关文章

      网友评论

          本文标题:Glide4.x 图片高斯模糊

          本文链接:https://www.haomeiwen.com/subject/itudpqtx.html