1、http://jhlabs.com/ip/index.html

  1. public static byte[] blur(byte[] data) throws IOException {
  2. ByteArrayInputStream bais = new ByteArrayInputStream(data);
  3. BufferedImage img = ImageIO.read(bais);
  4. GaussianFilter gaussianFilter = new GaussianFilter();
  5. gaussianFilter.filter(img, img);
  6. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  7. ImageIO.write(img, "jpg", baos);
  8. return baos.toByteArray();
  9. } 

Maven地址:http://mvnrepository.com/artifact/com.jhlabs/filters

除了高斯模糊,这人还写了好多图片处理的filter,参见:http://jhlabs.com/ip/filters/index.html

2、别人写的一个类,也很赞

  1. package com.extr.util;
  2.  
  3. import javax.imageio.ImageIO;
  4. import java.awt.*;
  5. import java.awt.image.BufferedImage;
  6. import java.awt.image.PixelGrabber;
  7. import java.io.ByteArrayInputStream;
  8. import java.io.ByteArrayOutputStream;
  9. import java.io.IOException;
  10.  
  11. public class GaussianBlurUtil {
  12.  
  13. public static byte[] blur(byte[] data) throws IOException {
  14. ByteArrayInputStream bais = new ByteArrayInputStream(data);
  15. BufferedImage img = ImageIO.read(bais);
  16. img = blur(img, 50);
  17. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  18. ImageIO.write(img, "jpg", baos);
  19. return baos.toByteArray();
  20. }
  21.  
  22. /**
  23. * 模糊执行方法
  24. *
  25. * @param img 原图片
  26. * @param radius 模糊权重
  27. * @return 模糊后图片
  28. */
  29. public static BufferedImage blur(BufferedImage img, int radius) throws IOException {
  30. int height = img.getHeight();
  31. int width = img.getWidth();
  32. int[] values = getPixArray(img, width, height);
  33. values = doBlur(values, width, height, radius);
  34. img.setRGB(0, 0, width, height, values, 0, width);
  35. return img;
  36. }
  37.  
  38. /**
  39. * 获取图像像素矩阵
  40. *
  41. * @param im
  42. * @param w
  43. * @param h
  44. * @return
  45. */
  46. private static int[] getPixArray(Image im, int w, int h) {
  47. int[] pix = new int[w * h];
  48. PixelGrabber pg = null;
  49. try {
  50. pg = new PixelGrabber(im, 0, 0, w, h, pix, 0, w);
  51. if (pg.grabPixels() != true)
  52. try {
  53. throw new java.awt.AWTException("pg error" + pg.status());
  54. } catch (Exception eq) {
  55. eq.printStackTrace();
  56. }
  57. } catch (Exception ex) {
  58. ex.printStackTrace();
  59. }
  60. return pix;
  61. }
  62.  
  63. /**
  64. * 高斯模糊算法。
  65. *
  66. * @param pix
  67. * @param w
  68. * @param h
  69. * @param radius
  70. * @return
  71. */
  72. public static int[] doBlur(int[] pix, int w, int h, int radius) throws IOException {
  73. int wm = w - 1;
  74. int hm = h - 1;
  75. int wh = w * h;
  76. int div = radius + radius + 1;
  77. int r[] = new int[wh];
  78. int g[] = new int[wh];
  79. int b[] = new int[wh];
  80. int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  81. int vmin[] = new int[Math.max(w, h)];
  82. int divsum = (div + 1) >> 1;
  83. divsum *= divsum;
  84. int dv[] = new int[256 * divsum];
  85. for (i = 0; i < 256 * divsum; i++) {
  86. dv[i] = (i / divsum);
  87. }
  88. yw = yi = 0;
  89. int[][] stack = new int[div][3];
  90. int stackpointer;
  91. int stackstart;
  92. int[] sir;
  93. int rbs;
  94. int r1 = radius + 1;
  95. int routsum, goutsum, boutsum;
  96. int rinsum, ginsum, binsum;
  97. for (y = 0; y < h; y++) {
  98. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  99. for (i = -radius; i <= radius; i++) {
  100. p = pix[yi + Math.min(wm, Math.max(i, 0))];
  101. sir = stack[i + radius];
  102. sir[0] = (p & 0xff0000) >> 16;
  103. sir[1] = (p & 0x00ff00) >> 8;
  104. sir[2] = (p & 0x0000ff);
  105. rbs = r1 - Math.abs(i);
  106. rsum += sir[0] * rbs;
  107. gsum += sir[1] * rbs;
  108. bsum += sir[2] * rbs;
  109. if (i > 0) {
  110. rinsum += sir[0];
  111. ginsum += sir[1];
  112. binsum += sir[2];
  113. } else {
  114. routsum += sir[0];
  115. goutsum += sir[1];
  116. boutsum += sir[2];
  117. }
  118. }
  119. stackpointer = radius;
  120. for (x = 0; x < w; x++) {
  121. r[yi] = dv[rsum];
  122. g[yi] = dv[gsum];
  123. b[yi] = dv[bsum];
  124. rsum -= routsum;
  125. gsum -= goutsum;
  126. bsum -= boutsum;
  127. stackstart = stackpointer - radius + div;
  128. sir = stack[stackstart % div];
  129. routsum -= sir[0];
  130. goutsum -= sir[1];
  131. boutsum -= sir[2];
  132. if (y == 0) {
  133. vmin[x] = Math.min(x + radius + 1, wm);
  134. }
  135. p = pix[yw + vmin[x]];
  136. sir[0] = (p & 0xff0000) >> 16;
  137. sir[1] = (p & 0x00ff00) >> 8;
  138. sir[2] = (p & 0x0000ff);
  139. rinsum += sir[0];
  140. ginsum += sir[1];
  141. binsum += sir[2];
  142. rsum += rinsum;
  143. gsum += ginsum;
  144. bsum += binsum;
  145. stackpointer = (stackpointer + 1) % div;
  146. sir = stack[(stackpointer) % div];
  147. routsum += sir[0];
  148. goutsum += sir[1];
  149. boutsum += sir[2];
  150. rinsum -= sir[0];
  151. ginsum -= sir[1];
  152. binsum -= sir[2];
  153. yi++;
  154. }
  155. yw += w;
  156. }
  157. for (x = 0; x < w; x++) {
  158. rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
  159. yp = -radius * w;
  160. for (i = -radius; i <= radius; i++) {
  161. yi = Math.max(0, yp) + x;
  162. sir = stack[i + radius];
  163. sir[0] = r[yi];
  164. sir[1] = g[yi];
  165. sir[2] = b[yi];
  166. rbs = r1 - Math.abs(i);
  167. rsum += r[yi] * rbs;
  168. gsum += g[yi] * rbs;
  169. bsum += b[yi] * rbs;
  170. if (i > 0) {
  171. rinsum += sir[0];
  172. ginsum += sir[1];
  173. binsum += sir[2];
  174. } else {
  175. routsum += sir[0];
  176. goutsum += sir[1];
  177. boutsum += sir[2];
  178. }
  179. if (i < hm) {
  180. yp += w;
  181. }
  182. }
  183. yi = x;
  184. stackpointer = radius;
  185. for (y = 0; y < h; y++) {
  186. pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)
  187. | (dv[gsum] << 8) | dv[bsum];
  188. rsum -= routsum;
  189. gsum -= goutsum;
  190. bsum -= boutsum;
  191. stackstart = stackpointer - radius + div;
  192. sir = stack[stackstart % div];
  193. routsum -= sir[0];
  194. goutsum -= sir[1];
  195. boutsum -= sir[2];
  196. if (x == 0) {
  197. vmin[y] = Math.min(y + r1, hm) * w;
  198. }
  199. p = x + vmin[y];
  200. sir[0] = r[p];
  201. sir[1] = g[p];
  202. sir[2] = b[p];
  203. rinsum += sir[0];
  204. ginsum += sir[1];
  205. binsum += sir[2];
  206. rsum += rinsum;
  207. gsum += ginsum;
  208. bsum += binsum;
  209. stackpointer = (stackpointer + 1) % div;
  210. sir = stack[stackpointer];
  211. routsum += sir[0];
  212. goutsum += sir[1];
  213. boutsum += sir[2];
  214. rinsum -= sir[0];
  215. ginsum -= sir[1];
  216. binsum -= sir[2];
  217. yi += w;
  218. }
  219. }
  220. return pix;
  221. }
  222. }

  

高斯模糊的Java实现的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 简单的java高斯模糊算法

    import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOEx ...

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

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

  4. Android开发学习之路-动态高斯模糊怎么做

    什么是高斯模糊? 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪 ...

  5. Android 图片滤镜工具——高斯模糊

    ===================高斯模糊========================= 创建一个 ImageFilter 类(滤镜工具),代码如下: import android.graph ...

  6. Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途

    Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途 1.1. 高斯模糊 的原理(周边像素的平均值+正态分布的权重1 1.2. 高斯模糊 的用途(磨皮,毛玻璃效果,背景虚化 ...

  7. Android高斯模糊

    传送门 github地址:http://developer.android.com/guide/topics/renderscript/compute.html: https://github.com ...

  8. 一步步实现滑动验证码,Java图片处理关键代码

    最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. ...

  9. Android图像处理 - 高斯模糊的原理及实现

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 前言 高斯模糊是图像处理中几乎每个程序员 ...

随机推荐

  1. PHP加密解密方法,使用openssl加密解密

    /** * des 加密算法 */ function do_mencrypt($input, $key) { if (!function_exists("mcrypt_module_open ...

  2. JAXB在Java 9/10并且使用Tomcat 9的问题

    Implementation of JAXB-API has not been found on module path or classpath. JAXB API是java EE 的API,jav ...

  3. 认识Fiddler

    一.Fiddler界面介绍.(注:下图中的功能区面板显示的是“Inspectors”的选项卡界面) 二.工具栏介绍. 1.气泡:备注.添加之后在会话栏的Comment列中显示备注内容. 2.Repla ...

  4. Git branch 出现"HEAD detached at head xxxxx"

    Git branch 出现"HEAD detached at head xxxxx" git branch <your-branch-name> xxxxx      ...

  5. TF:TF定义两个变量相乘之placeholder先hold类似变量+feed_dict最后外界传入值—Jason niu

    #TF:TF定义两个变量相乘之placeholder先hold类似变量+feed_dict最后外界传入值 import tensorflow as tf input1 = tf.placeholder ...

  6. 【JavaScript】函数

    No1: 定义函数 function abs(x) { if (x >= 0) { return x; } else { return -x; } } var abs = function (x ...

  7. gitalk报错问题

    今天为了优化个人博客,将博客同时部署到Github和Coding,之后虽然博客访问速度相比以前有很大的提升,但是不知道gitalk评论会莫名出现问题 问题 点击使用GitHub登陆会跳转到个人博客主页 ...

  8. RabbitMQ实战经验分享

    前言 最近在忙一个高考项目,看着系统顺利完成了这次高考,终于可以松口气了.看到那些即将参加高考的学生,也想起当年高三的自己. 下面分享下RabbitMQ实战经验,希望对大家有所帮助: 一.生产消息 关 ...

  9. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)

    题目链接 \(Description\) 有一张\(n\)个点的完全图,每个点的权值为\(a_i\),两个点之间的边权为\(a_i\ xor\ a_j\).求该图的最小生成树. \(n\leq2*10 ...

  10. 后台执行Bitmap加载

    如果加载图片时,使用的图片数据源不是来自于内存,而是来自硬盘或网络时,一般不会再UI线程执行图片加载操作. 图片的加载速度取决于很多方面(往往具有不可预测性),比如:硬盘或者网络的读写速度.图片大小. ...