Android 图片高斯模糊

1.RenderScript 

/**
     * 将传入的图片进行高斯模糊
     *
     * @param mContext 上下文
     * @param bitmap   图片对象
     * @param radius   高斯模糊半径
     * @return 模糊之后的对象
     */
    public static Bitmap blur(Context mContext, Bitmap bitmap, float radius) {
        long time = System.currentTimeMillis();
        // 创建输出图片
//        Bitmap output = Bitmap.createBitmap(bitmap);

        //把要模糊的图片变小
//        int width = Math.round(bitmap.getWidth() * 0.125f);
//        int height = Math.round(bitmap.getHeight() * 0.125f);

        int width = Math.round(bitmap.getWidth() * 1f);
        int height = Math.round(bitmap.getHeight() * 1f);

        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);

        Bitmap output = bitmap.copy(bitmap.getConfig(), true);

        // 构建一个RenderScript对象
        RenderScript rs = RenderScript.create(mContext);
        // 创建高斯模糊脚本
        ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        // 开辟输入内存
        Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
        // 开辟输出内存
        Allocation allOut = Allocation.createFromBitmap(rs, output);
        // 设置模糊半径,范围0f=23则使用rs.releaseAllContexts()
        rs.destroy();
        LogUtil.i("showtime", "blur bitmap time:  " + (System.currentTimeMillis() - time));
        return output;
    }

使用// 构建一个RenderScript对象 RenderScript rs = RenderScript.create(mContext); 构建一个

ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
// 设置模糊半径,范围0f 
  

注意范围

2.使用Glide构建BlurTransformation

需要添加依赖文件

implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
implementation 'jp.wasabeef:glide-transformations:4.0.1'
GlideApp.with(JLWelcomeActivity.this)
                        .asBitmap()
                        .placeholder(mImage.getDrawable())
                        .load(template.getBackgroundUrl())
                        .error(R.drawable.img_welcome_default_bg)
//                        .dontAnimate()
                        .skipMemoryCache(false)
                        .listener(new RequestListener() {
                            @Override
                            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
                                shadebgBlur(null);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                                shadebgBlur(resource);
                                return false;
                            }
                        })
                        .into(mImage);

在listener 监听下载的图片文件

// 截取并高斯模糊 不需要截取则不用
private void shadebgBlur(Bitmap bitmap){
    if(bitmap == null){
        bitmap = ImageBasicUtils.drawableToBitmap(mImage.getDrawable());
    }
    int y = 160;
    Bitmap bitmap1 =  ImageBasicUtils.getCaptureImg(bitmap, 0, y, 0, 320);
    GlideApp.with(JLWelcomeActivity.this)
            .load(bitmap1)
            .apply(RequestOptions.bitmapTransform(new BlurTransformation(15, 10)))
            .into(mShade);
    
}

个人建议使用第二种,简单实用,欢迎大家讨论。

你可能感兴趣的:(Android)