diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java new file mode 100644 index 0000000000..41f1db3614 --- /dev/null +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java @@ -0,0 +1,57 @@ +package com.mogo.utils.glide; + +import android.content.Context; +import android.graphics.Bitmap; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicBlur; + +import androidx.annotation.NonNull; + +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; + +/** + * 使用Glide加载图片时,使该图片进行高斯模糊 + * 基本用法:Glide.with(this).load(userInfo.headImgurl).apply(RequestOptions.bitmapTransform(GlideBlurTransformation(this))).into(ivCardBg) + * + * @author tongchenfei + */ +public class GlideBlurTransformation extends CenterCrop { + private static final float DEFAULT_BLUR_RADIUS = 25F; + + private Context context; + private float blurRadius; + public GlideBlurTransformation(Context context) { + this(context, DEFAULT_BLUR_RADIUS); + } + + public GlideBlurTransformation(Context context, float blurRadius) { + this.context = context; + this.blurRadius = blurRadius; + } + + @Override + protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, + int outWidth, int outHeight) { + Bitmap bitmap = super.transform(pool, toTransform, outWidth, outHeight); + return blurBitmap(bitmap, blurRadius, (int) (outWidth * 0.5), (int) (outHeight * 0.5)); + } + + private Bitmap blurBitmap(Bitmap bitmap, float blurRadius, int outWidth, int outHeight) { + Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, outWidth, outHeight, false); + Bitmap outBitmap = Bitmap.createBitmap(inputBitmap); + + RenderScript renderScript = RenderScript.create(context); + ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(renderScript, + Element.U8_4(renderScript)); + Allocation tmpIn = Allocation.createFromBitmap(renderScript, inputBitmap); + Allocation tmpOut = Allocation.createFromBitmap(renderScript, outBitmap); + blurScript.setRadius(blurRadius); + blurScript.setInput(tmpIn); + blurScript.forEach(tmpOut); + tmpOut.copyTo(outBitmap); + return outBitmap; + } +}