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<radius<=25f
gaussianBlue.setRadius(radius);
// 设置输入内存
gaussianBlue.setInput(allIn);
// 模糊编码,并将内存填入输出内存
gaussianBlue.forEach(allOut);
// 将输出内存编码为Bitmap,图片大小必须注意
allOut.copyTo(output);
// 关闭RenderScript对象,API>=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<radius<=25f gaussianBlue.setRadius(radius);
注意范围
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<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
shadebgBlur(null);
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> 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); }
个人建议使用第二种,简单实用,欢迎大家讨论。