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

创建一个 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. 【别人的老师VS你的老师 】同样是老师,差别怎么这么大呢!?

  2. node基础11:接受参数

    1.接收参数 在Node中接受GET/POST请求的参数不像PHP那样,在PHP中直接有全局变量$_GET,$_POST来接受url,或者请求体重的参数. 在node中接受GET参数使用url.par ...

  3. 搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

    工欲善其事必先利其器,  下面来说说代码生成器. 现在代码生成器品种繁多各式各样, 什么codesmith.T4. 动软也算.那么每款代码生成器都有自己模板解析引擎. 现在比较流行的 NVelocit ...

  4. Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作

    一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...

  5. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  6. Win10 UWP开发实现Bing翻译

    微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...

  7. 招聘前端、Java后端开发、测试、Mysql DBA

    公司介绍: http://www.lagou.com/gongsi/43095.html http://www.yamichu.com 简历发到: zhuye@yamichu.com 招聘职位: JA ...

  8. 无法加载父级样式或设置IIS的asp站点启用父路径

    打开IIS 1.单击站点,在"IIS"区域中找到ASP图标,双击. 2.找到"启用父路径"项目,将对应的值设置为"TRUE"即可.   顶

  9. Win10 PC一周年更新正式版14393.447 32位/64位更新补丁KB3200970下载 Flash补丁Kb3202790下载

    微软在今天凌晨推送了Win10 PC一周年更新正式版14393.447,本次更新补丁代号为KB3200970,面向Win10一周年更新正式版的PC用户. 更新日志 • 提升了多媒体音频.远程桌面以及I ...

  10. 解决Java接口内部类的main()方法无法打印输出的问题

    问题源自<Thinking in Java>关于内部类的章节,例子如下: public interface ClassInInterface{ void howdy(); public c ...