===================高斯模糊=========================

创建一个 ImageFilter 类(滤镜工具),代码如下:

  1. import android.graphics.Bitmap;
  2.  
  3. public class ImageFilter {
  4. /**
  5. * 高斯模糊滤镜
  6. * @param sentBitmap 需要处理的Bitmap对象
  7. * @param radius 高斯模糊半径
  8. * @param canReuseInBitmap 处理结果应用到Bitmap本身
  9. * @return
  10. */
  11. public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
  12.  
  13. Bitmap bitmap;
  14. if (canReuseInBitmap) {
  15. bitmap = sentBitmap;
  16. } else {
  17. bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
  18. }
  19.  
  20. if (radius < 1) {
  21. return (null);
  22. }
  23.  
  24. int w = bitmap.getWidth();
  25. int h = bitmap.getHeight();
  26.  
  27. int[] pix = new int[w * h];
  28. bitmap.getPixels(pix, 0, w, 0, 0, w, h);
  29.  
  30. int wm = w - 1;
  31. int hm = h - 1;
  32. int wh = w * h;
  33. int div = radius + radius + 1;
  34.  
  35. int r[] = new int[wh];
  36. int g[] = new int[wh];
  37. int b[] = new int[wh];
  38. int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  39. int vmin[] = new int[Math.max(w, h)];
  40.  
  41. int divsum = (div + 1) >> 1;
  42. divsum *= divsum;
  43. int dv[] = new int[256 * divsum];
  44. for (i = 0; i < 256 * divsum; i++) {
  45. dv[i] = (i / divsum);
  46. }
  47.  
  48. yw = yi = 0;
  49.  
  50. int[][] stack = new int[div][3];
  51. int stackpointer;
  52. int stackstart;
  53. int[] sir;
  54. int rbs;
  55. int r1 = radius + 1;
  56. int routsum, goutsum, boutsum;
  57. int rinsum, ginsum, binsum;
  58.  
  59. for (y = 0; y < h; y++) {
  60. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  61. for (i = -radius; i <= radius; i++) {
  62. p = pix[yi + Math.min(wm, Math.max(i, 0))];
  63. sir = stack[i + radius];
  64. sir[0] = (p & 0xff0000) >> 16;
  65. sir[1] = (p & 0x00ff00) >> 8;
  66. sir[2] = (p & 0x0000ff);
  67. rbs = r1 - Math.abs(i);
  68. rsum += sir[0] * rbs;
  69. gsum += sir[1] * rbs;
  70. bsum += sir[2] * rbs;
  71. if (i > 0) {
  72. rinsum += sir[0];
  73. ginsum += sir[1];
  74. binsum += sir[2];
  75. } else {
  76. routsum += sir[0];
  77. goutsum += sir[1];
  78. boutsum += sir[2];
  79. }
  80. }
  81. stackpointer = radius;
  82.  
  83. for (x = 0; x < w; x++) {
  84.  
  85. r[yi] = dv[rsum];
  86. g[yi] = dv[gsum];
  87. b[yi] = dv[bsum];
  88.  
  89. rsum -= routsum;
  90. gsum -= goutsum;
  91. bsum -= boutsum;
  92.  
  93. stackstart = stackpointer - radius + div;
  94. sir = stack[stackstart % div];
  95.  
  96. routsum -= sir[0];
  97. goutsum -= sir[1];
  98. boutsum -= sir[2];
  99.  
  100. if (y == 0) {
  101. vmin[x] = Math.min(x + radius + 1, wm);
  102. }
  103. p = pix[yw + vmin[x]];
  104.  
  105. sir[0] = (p & 0xff0000) >> 16;
  106. sir[1] = (p & 0x00ff00) >> 8;
  107. sir[2] = (p & 0x0000ff);
  108.  
  109. rinsum += sir[0];
  110. ginsum += sir[1];
  111. binsum += sir[2];
  112.  
  113. rsum += rinsum;
  114. gsum += ginsum;
  115. bsum += binsum;
  116.  
  117. stackpointer = (stackpointer + 1) % div;
  118. sir = stack[(stackpointer) % div];
  119.  
  120. routsum += sir[0];
  121. goutsum += sir[1];
  122. boutsum += sir[2];
  123.  
  124. rinsum -= sir[0];
  125. ginsum -= sir[1];
  126. binsum -= sir[2];
  127.  
  128. yi++;
  129. }
  130. yw += w;
  131. }
  132. for (x = 0; x < w; x++) {
  133. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  134. yp = -radius * w;
  135. for (i = -radius; i <= radius; i++) {
  136. yi = Math.max(0, yp) + x;
  137.  
  138. sir = stack[i + radius];
  139.  
  140. sir[0] = r[yi];
  141. sir[1] = g[yi];
  142. sir[2] = b[yi];
  143.  
  144. rbs = r1 - Math.abs(i);
  145.  
  146. rsum += r[yi] * rbs;
  147. gsum += g[yi] * rbs;
  148. bsum += b[yi] * rbs;
  149.  
  150. if (i > 0) {
  151. rinsum += sir[0];
  152. ginsum += sir[1];
  153. binsum += sir[2];
  154. } else {
  155. routsum += sir[0];
  156. goutsum += sir[1];
  157. boutsum += sir[2];
  158. }
  159.  
  160. if (i < hm) {
  161. yp += w;
  162. }
  163. }
  164. yi = x;
  165. stackpointer = radius;
  166. for (y = 0; y < h; y++) {
  167. // Preserve alpha channel: ( 0xff000000 & pix[yi] )
  168. pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
  169.  
  170. rsum -= routsum;
  171. gsum -= goutsum;
  172. bsum -= boutsum;
  173.  
  174. stackstart = stackpointer - radius + div;
  175. sir = stack[stackstart % div];
  176.  
  177. routsum -= sir[0];
  178. goutsum -= sir[1];
  179. boutsum -= sir[2];
  180.  
  181. if (x == 0) {
  182. vmin[y] = Math.min(y + r1, hm) * w;
  183. }
  184. p = x + vmin[y];
  185.  
  186. sir[0] = r[p];
  187. sir[1] = g[p];
  188. sir[2] = b[p];
  189.  
  190. rinsum += sir[0];
  191. ginsum += sir[1];
  192. binsum += sir[2];
  193.  
  194. rsum += rinsum;
  195. gsum += ginsum;
  196. bsum += binsum;
  197.  
  198. stackpointer = (stackpointer + 1) % div;
  199. sir = stack[stackpointer];
  200.  
  201. routsum += sir[0];
  202. goutsum += sir[1];
  203. boutsum += sir[2];
  204.  
  205. rinsum -= sir[0];
  206. ginsum -= sir[1];
  207. binsum -= sir[2];
  208.  
  209. yi += w;
  210. }
  211. }
  212.  
  213. bitmap.setPixels(pix, 0, w, 0, 0, w, h);
  214.  
  215. return (bitmap);
  216. }
  217. }

ImageFilter.java

调用 ImageFilter 的 doBlur 静态方法,即可对图片进行高斯模糊。

doBlur 接受三个参数(图片源 Bitmap,模糊半径 Integer,处理原图 Boolean

由于图片处理需要时间,所以必须进行异步处理(放在子线程中运行),最终将结果返回UI线程。

提升性能:可以将图片压缩后在进行高斯模糊。

===================实例测试=======================

XML:( layout/activity_image.xml )

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5.  
  6. <ImageView
  7. android:id="@+id/image_view"
  8. android:layout_width="300dp"
  9. android:layout_height="300dp"
  10. android:layout_centerInParent="true" />
  11.  
  12. <ImageView
  13. android:layout_width="100dp"
  14. android:layout_height="100dp"
  15. android:layout_centerInParent="true"
  16. android:src="@drawable/woider" />
  17.  
  18. </RelativeLayout>

Activity:( ImageActivity.java )

  1. public class ImageActivity extends Activity {
  2.  
  3. private ImageView imageView;
  4. private Bitmap bitmap;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9.  
  10. setContentView(R.layout.activity_image);
  11. imageView = (ImageView) findViewById(R.id.image_view);
  12. //从资源中获取Bitmap
  13. bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.woider);
  14. //异步处理
  15. new Thread(new Runnable() {
  16. @Override
  17. public void run() {
  18. //高斯模糊处理图片
  19. bitmap = ImageFilter.doBlur(bitmap, 30, false);
  20. //处理完成后返回主线程
  21. runOnUiThread(new Runnable() {
  22. @Override
  23. public void run() {
  24. imageView.setImageBitmap(bitmap);
  25. }
  26. });
  27. }
  28. }).start();
  29. }
  30. }

=====================运行截图======================

Android 图片滤镜工具——高斯模糊的更多相关文章

  1. android全功能音乐播放器、基于MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的综合应用、图片滤镜处理等源码

    Android仿微信朋友圈查看图片下拽返回. Android图片滤镜处理,相机滤镜处理效果源码 Android自定义View源码:一个水平的进度条 基于MVP-Clean + Weex + RxJav ...

  2. [Android]-图片JNI(C++\Java)高斯模糊的实现与比較

    版权声明:本文作者:Qiujuer https://github.com/qiujuer; 转载请注明出处,盗版必究! !! https://blog.csdn.net/qiujuer/article ...

  3. android mvp高速开发框架介绍(dileber使用之图片下载工具)

    这几天忙着工作- 今天抽时间又把框架的bug处理了一下--并且把volley的源代码改动了一下 android mvp框架:dileber(https://github.com/dileber/dil ...

  4. 【Android LibGDX游戏引擎开发教程】第06期:图形图像的绘制(下)图片整合工具的使用

    在上一篇文章中,我们提到了图片必须是2的n次方的问题.但是随着Libgdx的不断完善和发展,使用一些工具就 可以很好的解决了这样一个问题,但是它的功能又不仅仅只限于此,那么下面就来让我们看看Textu ...

  5. Android图像滤镜框架GPUImage从配置到应用

    GPUImage简介 GPUImage 是iOS下一个开源的基于GPU的图像处理库,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜.GPUImage for Android是它在Andr ...

  6. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  7. Android 照相 滤镜

    android-image-filter 19种相片滤镜,使用也简单,all filters in file BitmapFilter.java : Bitmap newBitmap = Bitmap ...

  8. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  9. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

      Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Mic ...

随机推荐

  1. SQL Server日志文件(LDF文件)

    一.日志文件过大处理方法: 1.设置数据库模式为简单模式:ALTER DATABASE 数据库名 SET RECOVERY SIMPLE 或者选中数据库-属性-选项-恢复模式设置为简单. 2.收缩日志 ...

  2. web前端开发最佳实践笔记

    一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...

  3. 在oracle中,如何当前系统时间往前推7天

    ' day from dual 另附: 当前时间减去7分钟的时间 ' MINUTE from dual 当前时间减去7小时的时间 ' hour from dual 当前时间减去7天的时间 ' day ...

  4. VIM编辑器常用命令

    一.剪切: 1. 欲从当前光标删除至下一个单词,请输入:dw  2. 欲从当前光标删除至当前行末尾,请输入:d$  3. 欲删除整行,请输入:dd //可以使用 dNd删除多行 N代表行数  4. 欲 ...

  5. mysql的基本命令行操作

    mysql>CREATE DATABASE imooc; //创建数据库 mysql> USE imooc ;//选择数据库 mysql> SELECT DATABASE();//查 ...

  6. jQuery链式操作[转]

    用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...

  7. 软件开发学习笔记 <二>软件开发模型、Up、Rup、敏捷Up

    软件开发过程(process) 是一个将用户需求转化为软件系统所需要的活动的集合. 软件生命周期(SDLC,Software Devlopment Life Cycle) 软件从孕育.诞生.成长.成熟 ...

  8. gulp-rev-collector自定义修改rev-manifest.json后替换不成功的问题分析

    由于项目需要,我要把common.js替换成build.min.js,接着后面才用到build.min.js=>build-te234ds.min.js这样的形式替换,但是我发现怎么替换都不能把 ...

  9. npm命令教程

    教程:http://www.runoob.com/nodejs/nodejs-npm.html 常用命令:http://www.cnblogs.com/PeunZhang/p/5553574.html

  10. 记一次MYSQL更新优化

    引言 今天(August 5, 2015 5:34 PM)在给数据库中一张表的结构做一次调整,添加了几个字段,后面对之前的数据进行刷新,刷新的内容是:对其中的一个已有字段url进行匹配,然后更新新加的 ...