第一种是最简单方便的结合强大的Glide图片加载框架的使用(推荐)

先来看看效果图吧!

这种是使用头像作为背景模糊背景使用的:

Glide框架结合使用

第一步添加下面依赖并同步

compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'jp.wasabeef:glide-transformations:2.0.1'

第二步glide代码的使用如下

   //头像final String photo = MapUtil.getValueStr(data, "fileUrl");Glide.with(mContext).load(photo).dontAnimate()//加载过程中的图片显示.placeholder(R.mipmap.bg4)//加载失败中的图片显示//如果重试3次(下载源代码可以根据需要修改)还是无法成功加载图片,则用错误占位符图片显示。.error(R.mipmap.bg4)//第二个参数是圆角半径,第三个是模糊程度,2-5之间个人感觉比较好。.bitmapTransform(new BlurTransformation(PersonalActivity.this, 14, 1))
.into(iv_person_bg);

这种方法是不是很简单一行代码解决问题
.bitmapTransform(new BlurTransformation(PersonalActivity.this, 14, 1))

第二种方法稍微麻烦点,效果都一样

方法中会用到这个类

package teacherlove.zontonec.com.ztteacherlove.helper;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;/**
*
*   @data 创建时间: 2017/8/24
*
*   @author 创建人: kris_liutao
*
*   @description  功能描述: 高斯模糊处理背景图
*
*/public class BlurImageview {/*** 根据imagepath获取bitmap*//*** 得到本地或者网络上的bitmap url - 网络或者本地图片的绝对路径,比如:* A.网络路径: url="http://blog.foreverlove.us/girl2.png" ;* B.本地路径:url="file://mnt/sdcard/photo/image.png";* C.支持的图片格式 ,png, jpg,bmp,gif等等* @param url* @return*/public static int IO_BUFFER_SIZE = 2 * 1024;public static Bitmap GetUrlBitmap(String url, int scaleRatio) {int blurRadius = 8;//通常设置为8就行。if (scaleRatio <= 0) {scaleRatio = 10;}Bitmap originBitmap = null;InputStream in = null;BufferedOutputStream out = null;try {in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);copy(in, out);out.flush();byte[] data = dataStream.toByteArray();originBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,originBitmap.getWidth() / scaleRatio,originBitmap.getHeight() / scaleRatio,false);Bitmap blurBitmap = doBlur(scaledBitmap, blurRadius, true);return blurBitmap;} catch (IOException e) {e.printStackTrace();return null;}}private static void copy(InputStream in, OutputStream out)throws IOException {byte[] b = new byte[IO_BUFFER_SIZE];int read;while ((read = in.read(b)) != -1) {out.write(b, 0, read);}}//    把本地图片毛玻璃化public static Bitmap toBlur(Bitmap originBitmap, int scaleRatio) {//        int scaleRatio = 10;// 增大scaleRatio缩放比,使用一样更小的bitmap去虚化可以到更好的得模糊效果,而且有利于占用内存的减小;int blurRadius = 8;//通常设置为8就行。//增大blurRadius,可以得到更高程度的虚化,不过会导致CPU更加intensive/* 其中前三个参数很明显,其中宽高我们可以选择为原图尺寸的1/10;第四个filter是指缩放的效果,filter为true则会得到一个边缘平滑的bitmap,反之,则会得到边缘锯齿、pixelrelated的bitmap。这里我们要对缩放的图片进行虚化,所以无所谓边缘效果,filter=false。*/if (scaleRatio <= 0) {scaleRatio = 10;}Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,originBitmap.getWidth() / scaleRatio,originBitmap.getHeight() / scaleRatio,false);Bitmap blurBitmap = doBlur(scaledBitmap, blurRadius, true);return blurBitmap;}public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {Bitmap bitmap;if (canReuseInBitmap) {bitmap = sentBitmap;} else {bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);}if (radius < 1) {return (null);}int w = bitmap.getWidth();int h = bitmap.getHeight();int[] pix = new int[w * h];bitmap.getPixels(pix, 0, w, 0, 0, w, h);int wm = w - 1;int hm = h - 1;int wh = w * h;int div = radius + radius + 1;int r[] = new int[wh];int g[] = new int[wh];int b[] = new int[wh];int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;int vmin[] = new int[Math.max(w, h)];int divsum = (div + 1) >> 1;divsum *= divsum;int dv[] = new int[256 * divsum];for (i = 0; i < 256 * divsum; i++) {dv[i] = (i / divsum);}yw = yi = 0;int[][] stack = new int[div][3];int stackpointer;int stackstart;int[] sir;int rbs;int r1 = radius + 1;int routsum, goutsum, boutsum;int rinsum, ginsum, binsum;for (y = 0; y < h; y++) {rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;for (i = -radius; i <= radius; i++) {p = pix[yi + Math.min(wm, Math.max(i, 0))];sir = stack[i + radius];sir[0] = (p & 0xff0000) >> 16;sir[1] = (p & 0x00ff00) >> 8;sir[2] = (p & 0x0000ff);rbs = r1 - Math.abs(i);rsum += sir[0] * rbs;gsum += sir[1] * rbs;bsum += sir[2] * rbs;if (i > 0) {rinsum += sir[0];ginsum += sir[1];binsum += sir[2];} else {routsum += sir[0];goutsum += sir[1];boutsum += sir[2];}}stackpointer = radius;for (x = 0; x < w; x++) {r[yi] = dv[rsum];g[yi] = dv[gsum];b[yi] = dv[bsum];rsum -= routsum;gsum -= goutsum;bsum -= boutsum;stackstart = stackpointer - radius + div;sir = stack[stackstart % div];routsum -= sir[0];goutsum -= sir[1];boutsum -= sir[2];if (y == 0) {vmin[x] = Math.min(x + radius + 1, wm);}p = pix[yw + vmin[x]];sir[0] = (p & 0xff0000) >> 16;sir[1] = (p & 0x00ff00) >> 8;sir[2] = (p & 0x0000ff);rinsum += sir[0];ginsum += sir[1];binsum += sir[2];rsum += rinsum;gsum += ginsum;bsum += binsum;stackpointer = (stackpointer + 1) % div;sir = stack[(stackpointer) % div];routsum += sir[0];goutsum += sir[1];boutsum += sir[2];rinsum -= sir[0];ginsum -= sir[1];binsum -= sir[2];yi++;}yw += w;}for (x = 0; x < w; x++) {rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;yp = -radius * w;for (i = -radius; i <= radius; i++) {yi = Math.max(0, yp) + x;sir = stack[i + radius];sir[0] = r[yi];sir[1] = g[yi];sir[2] = b[yi];rbs = r1 - Math.abs(i);rsum += r[yi] * rbs;gsum += g[yi] * rbs;bsum += b[yi] * rbs;if (i > 0) {rinsum += sir[0];ginsum += sir[1];binsum += sir[2];} else {routsum += sir[0];goutsum += sir[1];boutsum += sir[2];}if (i < hm) {yp += w;}}yi = x;stackpointer = radius;for (y = 0; y < h; y++) {// Preserve alpha channel: ( 0xff000000 & pix[yi] )pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];rsum -= routsum;gsum -= goutsum;bsum -= boutsum;stackstart = stackpointer - radius + div;sir = stack[stackstart % div];routsum -= sir[0];goutsum -= sir[1];boutsum -= sir[2];if (x == 0) {vmin[y] = Math.min(y + r1, hm) * w;}p = x + vmin[y];sir[0] = r[p];sir[1] = g[p];sir[2] = b[p];rinsum += sir[0];ginsum += sir[1];binsum += sir[2];rsum += rinsum;gsum += ginsum;bsum += binsum;stackpointer = (stackpointer + 1) % div;sir = stack[stackpointer];routsum += sir[0];goutsum += sir[1];boutsum += sir[2];rinsum -= sir[0];ginsum -= sir[1];binsum -= sir[2];yi += w;}}bitmap.setPixels(pix, 0, w, 0, 0, w, h);return (bitmap);}}

然后在需要加载高斯模糊图的地方使用下面这个方法

 final String pattern = "2";//此处参数可以随意设置根据个人需求而言new Thread(new Runnable() {@Overridepublic void run() {int scaleRatio = 0;if (TextUtils.isEmpty(pattern)) {scaleRatio = 0;} else if (scaleRatio < 0) {scaleRatio = 10;} else {scaleRatio = Integer.parseInt(pattern);}//下面的这个方法必须在子线程中执行final Bitmap blurBitmap = BlurImageview.GetUrlBitmap(photo, scaleRatio);//刷新ui必须在主线程中执行App.runOnUIThread(new Runnable() {@Override
public void run() {                                           iv_person_bg.setScaleType(ImageView.ScaleType.CENTER_CROP);                                               iv_person_bg.setImageBitmap(blurBitmap);}});}
}).start();

这个刷新UI我给写在Application类的子类App下面了

   /*** 在主线程中刷新UI的方法** @param r*/public static void runOnUIThread(Runnable r) {App.getMainHandler().post(r);}//用来在主线程中刷新uiprivate static Handler mHandler;public static Handler getMainHandler() {return mHandler;}

到此,就是所有使用到的代码,简简单单完成高斯模糊0.0

高斯模糊处理头像作为背景图的两种高效便捷方法相关推荐

  1. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...

  2. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

  3. 正确认识使用UML中的类图——辨析类图的两种存在形式

    摘要       本文通过对一个"学生选课系统"示例的简要分析与设计,说明UML图之一类图的两种作用及存在形式,以期借此澄清有些朋友可能对类图存在的误解与困惑. 前言       ...

  4. 图的两种存储形式(邻接矩阵、邻接表)

    图可以使用两种存储结构,分别是邻接矩阵和邻接表. 注意:一个图所对应的邻接矩阵唯一,所对应的邻接表不唯一 一.邻接矩阵 邻接矩阵以矩阵的形式存储图所有顶点间的关系.邻接矩阵具有以下特点: 1.邻接矩阵 ...

  5. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.   在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...

  6. MP4文件如何转换成GIF动态图?两种方法帮你搞定

    要将 MP4 文件转换为 GIF 动态图,您可以使用一些免费的在线工具或者软件进行转换.以下是两种常用的方法: 方法一:使用软件 1.下载并安装一个视频转换软件,例如 FFmpeg 或者 GifCam ...

  7. matlab 图像转视频教程,Matlab制作视频并转换成gif动态图的两种方法

    一.第一个方法比较简单,就是使用movie(f)直接取生成AVI视频文件. %% f(t)-->f(4*t+12) 并且验证%% function Signal_change() tic%记录程 ...

  8. python matplotlib在一张画布上画多个图的两种方法,plt.subplot(),plt.subplots()。

    Matplotlib在一张画布上画多个图的两种方法,plt.subplot,plt.subplots. 目录 回顾 plt.subplots()画法 plt.subplot()画法 保存 回顾 之前也 ...

  9. fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较

    我觉得作者写的挺好,评论也写的很对. 目前我的项目就是在VS2008+Qt+win7上开发的.我上次总结的QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件也说明了这个问题. ...

最新文章

  1. python IDE- IDLE
  2. linux vi 是目录,linux基本操作之目录、vi等
  3. linux怎么查看fastq格式文件,2020-01-11 了解FASTQ格式并处理FASTQ文件
  4. 反射工具类ReflectionUtils
  5. [BZOJ]1503: [NOI2004]郁闷的出纳员
  6. C#中,什么时候用yield return
  7. 控制台查出数据传到layui数据表格却没有数据的问题
  8. 局域网共享工具_局域网文件共享
  9. 关于Ubuntu下apt的一些用法及和yum的比较
  10. android:一个容易被遗忘的强大工具
  11. [收藏】正确使用SqlConnection对象,兼谈数据库连接池
  12. shp地图如何导入奥维地图手机_奥维地图如何导入路线数据?
  13. 推荐一个简洁免费轻量级的思维导向图软件Blumind
  14. HDFS上大文件如何切分?
  15. Macbook鼠标调节外接显示器亮度 - Shades for Mac(屏幕亮度调节软件) V1.2 苹果电脑版
  16. Windows XP/2000/Vista/7/8/8.1/10系统 hosts文件位置及使用
  17. Android设置屏幕亮度的两种方式
  18. VS间接寻址级别不同
  19. chrome谷歌浏览器安装插件
  20. 华为手机日历倒计时_倒计时软件app哪个好 苹果倒计时软件推荐

热门文章

  1. 大数据-玩转数据-阿里DataWorks开发治理平台
  2. 卫青和霍去病:汉匈战争史最天才的两名战将
  3. Nginx开启GZIP压缩,提升前端访问速度
  4. 【fpga里Verilog语言的小知识点】
  5. Python+Excel:批量重命名多个工作簿
  6. C语言函数操作大全----(超详细)
  7. linux修改dns不生效,Linux 临时修改和永久修改DNS的方法
  8. Objective-C 【对象-多文件开发简介】
  9. 2021 秋招算法岗人间地狱?人工智能方向年薪 60w 起!
  10. 海淘、跨境电商国际物流对接那些坑