使用Glide实现高斯模糊效果

第一步:引入依赖

  implementation 'com.github.bumptech.glide:glide:4.7.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
  implementation 'jp.wasabeef:glide-transformations:2.0.1'

第二步:自定义继承自BitmapTransformation的类

public class BlurTransformation extends BitmapTransformation {

    private static String STRING_CHARSET_NAME = "UTF-8";
    private static final String ID = "com.kevin.glidetest.BlurTransformation";
    private static Charset CHARSET = Charset.forName(STRING_CHARSET_NAME);
    private static final byte[] ID_BYTES = ID.getBytes(CHARSET);

    private static int MAX_RADIUS = 25;
    private static int DEFAULT_DOWN_SAMPLING = 1;

    private Context mContext;
    private BitmapPool mBitmapPool;

    private int mRadius;
    private int mSampling;

    public BlurTransformation(Context context) {
        this(context, Glide.get(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, BitmapPool pool) {
        this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, BitmapPool pool, int radius) {
        this(context, pool, radius, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, int radius) {
        this(context, Glide.get(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING);
    }

    public BlurTransformation(Context context, int radius, int sampling) {
        this(context, Glide.get(context).getBitmapPool(), radius, sampling);
    }

    public BlurTransformation(Context context, BitmapPool pool, int radius, int sampling) {
        mContext = context.getApplicationContext();
        mBitmapPool = pool;
        mRadius = radius;
        mSampling = sampling;
    }



    @Override
    protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int
            outWidth, int outHeight) {
        Bitmap source = toTrstansform;

        int width = source.getWidth();
        int height = source.getHeight();
        int scaledWidth = width / mSampling;
        int scaledHeight = height / mSampling;

        Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        canvas.scale(1 / (float) mSampling, 1 / (float) mSampling);
        Paint paint = new Paint();
        paint.setFlags(Paint.FILTER_BITMAP_FLAG);
        canvas.drawBitmap(source, 0, 0, paint);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            try {
                bitmap = RSBlur.blur(mContext, bitmap, mRadius);
            } catch (RSRuntimeException e) {
                bitmap = FastBlur.blur(bitmap, mRadius, true);
            }
        } else {
            bitmap = FastBlur.blur(bitmap, mRadius, true);
        }

        //return BitmapResource.obtain(bitmap, mBitmapPool);
        return bitmap;
    }

    @Override
    public int hashCode() {
        return ID.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof BlurTransformation;
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {
        messageDigest.update(ID_BYTES);
    }
}

第三步:通过以下代码来使用

    //设置图片控件的高斯模糊效果
    Glide.with(context)
         .load(url)
         .apply(bitmapTransform(new BlurTransformation(context, radius, samplint)
         .into(imageView);

    //设置ViewGroup背景(以ConstraintLayout为例)
    Glide.with(context)
         .load(url)
         .apply(RequestOptions.bitmapTransform(new BlurTransformation(context, radius, sampling)))
         .into(new SimpleTarget<Drawable>() 
         {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition)
            {
                constraintLayout.setBackground(Resource);
            }
         });

eg: 使用Transformation库自带的BlurTransformation来实现以下效果的话,在运行时会报以下错误:

java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updateDiskCacheKey(java.security.MessageDigest)"
参考链接

使用Glide4.8加载网络地址实现高斯模糊时报错

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中实现高斯模糊效果有多种方式。一种常用的方式是使用Glide库来加载图片并应用高斯模糊转换。通过使用`bitmapTransform`方法和`BlurTransformation`类,可以将图片进行高斯模糊处理。例如,可以使用以下代码实现高斯模糊效果: ```java Glide.with(this) .load(R.mipmap.image) .apply(bitmapTransform(new BlurTransformation(100))) .into(blurIv); ``` 另一种方式是通过手势滑动来实现动态的高斯模糊效果。可以通过监听触摸事件,在滑动过程中改变模糊图片的alpha值来达到不同程度的模糊效果。例如,可以使用以下代码实现: ```java mBlurImage.setOnTouchListener(new OnTouchListener() { private float mLastY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mLastY = event.getY(); break; case MotionEvent.ACTION_MOVE: float y = event.getY(); float alphaDelt = (y - mLastY) / 1000; float alpha = mBlurImage.getAlpha() + alphaDelt; if (alpha > 1.0) { alpha = 1.0f; } else if (alpha < 0.0) { alpha = 0.0f; } mTextView.setText(String.valueOf(alpha)); mBlurImage.setAlpha(alpha); break; case MotionEvent.ACTION_UP: break; } return true; } }); ``` 总结来说,Android中实现高斯模糊效果可以使用Glide库进行静态处理,也可以通过手势滑动来实现动态效果。具体选择哪种方式取决于实际需求和开发者的偏好。\[2\]\[3\] #### 引用[.reference_title] - *1* [Android12 支持高斯模糊高斯模糊原理](https://blog.csdn.net/u012165769/article/details/120888709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [android高斯模糊](https://blog.csdn.net/u014709812/article/details/51564856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android多种方式实现高斯模糊效果](https://blog.csdn.net/u012556114/article/details/81871578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值