这篇将讲到图片特效处理的模糊效果。跟前面一样是对像素点进行处理,算法是通用的,但耗时会更长,至于为什么,看了下面的代码你就会明白。

算法

一、简单算法:将像素点周围八个点包括自身一共九个点的RGB值分别相加后平均,作为当前像素点的RGB值,即可实现效果。

举例:

ABC

DEF

GHI

假如当前点是E,那么会有:

  1. E.r = (A.r + B.r + C.r + D.r + E.r + F.r + G.r + H.r + I.r) /9  // r表示的是E像素点RGB值的R值
  1. E.r = (A.r + B.r + C.r + D.r + E.r + F.r + G.r + H.r + I.r) / 9  // r表示的是E像素点RGB值的R值

E像素点的GB值类似。

二、采用高斯模糊:

高斯矩阵:

  1. int[] gauss = new int[] { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
  1. int[] gauss = new int[] { 1, 2, 1, 2, 4, 2, 1, 2, 1 };

算法是:将九个点的RGB值分别与高斯矩阵中的对应项相乘的和,然后再除以一个相应的值作为当前像素点的RGB值。

举例:(还是上面的九个点)
假如当前点是E,那么会有:

  1. int delta = 16;
  2. E.r =( A.r * gauss[0] + B.r * gauss[1] + C.r * gauss[2] + D.r * gauss[3] + E.r * gauss[4]
    + F.r * gauss[5] + G.r * gauss[6] + H.r * gauss[7] + I.r * gauss[8]) / delta
  1. int delta = 16;
  2. E.r =( A.r * gauss[0] + B.r * gauss[1] + C.r * gauss[2] + D.r * gauss[3] + E.r * gauss[4] + F.r * gauss[5] + G.r * gauss[6] + H.r * gauss[7] + I.r * gauss[8]) / delta

E像素点的GB值类似,delta的取值貌似没有规定值,可以自己设置任意值,但要想达到效果,能设的值很少,下面图片是值为16的效果。
处理效果:

原图片:

处理后:

两种处理方式的代码:

  1. /**
  2. * 模糊效果
  3. * @param bmp
  4. * @return
  5. */
  6. private Bitmap blurImage(Bitmap bmp)
  7. {
  8. int width = bmp.getWidth();
  9. int height = bmp.getHeight();
  10. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
  11. int pixColor = 0;
  12. int newR = 0;
  13. int newG =
    0;
  14. int newB = 0;
  15. int newColor = 0;
  16. int[][] colors = new
    int[9][3];
  17. for (int i =
    1, length = width - 1; i < length; i++)
  18. {
  19. for (int k =
    1, len = height - 1; k < len; k++)
  20. {
  21. for (int m =
    0; m < 9; m++)
  22. {
  23. int s =
    0;
  24. int p = 0;
  25. switch(m)
  26. {
  27. case
    0:
  28. s = i - 1;
  29. p = k - 1;
  30. break;
  31. case
    1:
  32. s = i;
  33. p = k - 1;
  34. break;
  35. case
    2:
  36. s = i + 1;
  37. p = k - 1;
  38. break;
  39. case
    3:
  40. s = i + 1;
  41. p = k;
  42. break;
  43. case
    4:
  44. s = i + 1;
  45. p = k + 1;
  46. break;
  47. case
    5:
  48. s = i;
  49. p = k + 1;
  50. break;
  51. case
    6:
  52. s = i - 1;
  53. p = k + 1;
  54. break;
  55. case
    7:
  56. s = i - 1;
  57. p = k;
  58. break;
  59. case
    8:
  60. s = i;
  61. p = k;
  62. }
  63. pixColor = bmp.getPixel(s, p);
  64. colors[m][0] = Color.red(pixColor);
  65. colors[m][1] = Color.green(pixColor);
  66. colors[m][2] = Color.blue(pixColor);
  67. }
  68. for (int m =
    0; m < 9; m++)
  69. {
  70. newR += colors[m][0];
  71. newG += colors[m][1];
  72. newB += colors[m][2];
  73. }
  74. newR = (int) (newR / 9F);
  75. newG = (int) (newG / 9F);
  76. newB = (int) (newB / 9F);
  77. newR = Math.min(255, Math.max(0, newR));
  78. newG = Math.min(255, Math.max(0, newG));
  79. newB = Math.min(255, Math.max(0, newB));
  80. newColor = Color.argb(255, newR, newG, newB);
  81. bitmap.setPixel(i, k, newColor);
  82. newR = 0;
  83. newG = 0;
  84. newB = 0;
  85. }
  86. }
  87. return bitmap;
  88. }
  89. /**
  90. * 柔化效果(高斯模糊)(优化后比上面快三倍)
  91. * @param bmp
  92. * @return
  93. */
  94. private Bitmap blurImageAmeliorate(Bitmap bmp)
  95. {
  96. long start = System.currentTimeMillis();
  97. // 高斯矩阵
  98. int[] gauss =
    new int[] {
    1, 2,
    1, 2,
    4, 2,
    1, 2,
    1 };
  99. int width = bmp.getWidth();
  100. int height = bmp.getHeight();
  101. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
  102. int pixR =
    0;
  103. int pixG = 0;
  104. int pixB =
    0;
  105. int pixColor =
    0;
  106. int newR =
    0;
  107. int newG = 0;
  108. int newB =
    0;
  109. int delta =
    16; // 值越小图片会越亮,越大则越暗
  110. int idx =
    0;
  111. int[] pixels = new
    int[width * height];
  112. bmp.getPixels(pixels, 0, width,
    0, 0, width, height);
  113. for (int i =
    1, length = height - 1; i < length; i++)
  114. {
  115. for (int k =
    1, len = width - 1; k < len; k++)
  116. {
  117. idx = 0;
  118. for (int m = -1; m <=
    1; m++)
  119. {
  120. for (int n = -1; n <=
    1; n++)
  121. {
  122. pixColor = pixels[(i + m) * width + k + n];
  123. pixR = Color.red(pixColor);
  124. pixG = Color.green(pixColor);
  125. pixB = Color.blue(pixColor);
  126. newR = newR + (int) (pixR * gauss[idx]);
  127. newG = newG + (int) (pixG * gauss[idx]);
  128. newB = newB + (int) (pixB * gauss[idx]);
  129. idx++;
  130. }
  131. }
  132. newR /= delta;
  133. newG /= delta;
  134. newB /= delta;
  135. newR = Math.min(255, Math.max(0, newR));
  136. newG = Math.min(255, Math.max(0, newG));
  137. newB = Math.min(255, Math.max(0, newB));
  138. pixels[i * width + k] = Color.argb(255, newR, newG, newB);
  139. newR = 0;
  140. newG = 0;
  141. newB = 0;
  142. }
  143. }
  144. bitmap.setPixels(pixels, 0, width,
    0, 0, width, height);
  145. long end = System.currentTimeMillis();
  146. Log.d("may",
    "used time="+(end - start));
  147. return bitmap;
  148. }
    1. /**
    2. * 模糊效果
    3. * @param bmp
    4. * @return
    5. */
    6. private Bitmap blurImage(Bitmap bmp)
    7. {
    8. int width = bmp.getWidth();
    9. int height = bmp.getHeight();
    10. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    11. int pixColor = 0;
    12. int newR = 0;
    13. int newG = 0;
    14. int newB = 0;
    15. int newColor = 0;
    16. int[][] colors = new int[9][3];
    17. for (int i = 1, length = width - 1; i < length; i++)
    18. {
    19. for (int k = 1, len = height - 1; k < len; k++)
    20. {
    21. for (int m = 0; m < 9; m++)
    22. {
    23. int s = 0;
    24. int p = 0;
    25. switch(m)
    26. {
    27. case 0:
    28. s = i - 1;
    29. p = k - 1;
    30. break;
    31. case 1:
    32. s = i;
    33. p = k - 1;
    34. break;
    35. case 2:
    36. s = i + 1;
    37. p = k - 1;
    38. break;
    39. case 3:
    40. s = i + 1;
    41. p = k;
    42. break;
    43. case 4:
    44. s = i + 1;
    45. p = k + 1;
    46. break;
    47. case 5:
    48. s = i;
    49. p = k + 1;
    50. break;
    51. case 6:
    52. s = i - 1;
    53. p = k + 1;
    54. break;
    55. case 7:
    56. s = i - 1;
    57. p = k;
    58. break;
    59. case 8:
    60. s = i;
    61. p = k;
    62. }
    63. pixColor = bmp.getPixel(s, p);
    64. colors[m][0] = Color.red(pixColor);
    65. colors[m][1] = Color.green(pixColor);
    66. colors[m][2] = Color.blue(pixColor);
    67. }
    68. for (int m = 0; m < 9; m++)
    69. {
    70. newR += colors[m][0];
    71. newG += colors[m][1];
    72. newB += colors[m][2];
    73. }
    74. newR = (int) (newR / 9F);
    75. newG = (int) (newG / 9F);
    76. newB = (int) (newB / 9F);
    77. newR = Math.min(255, Math.max(0, newR));
    78. newG = Math.min(255, Math.max(0, newG));
    79. newB = Math.min(255, Math.max(0, newB));
    80. newColor = Color.argb(255, newR, newG, newB);
    81. bitmap.setPixel(i, k, newColor);
    82. newR = 0;
    83. newG = 0;
    84. newB = 0;
    85. }
    86. }
    87. return bitmap;
    88. }
    89. /**
    90. * 柔化效果(高斯模糊)(优化后比上面快三倍)
    91. * @param bmp
    92. * @return
    93. */
    94. private Bitmap blurImageAmeliorate(Bitmap bmp)
    95. {
    96. long start = System.currentTimeMillis();
    97. // 高斯矩阵
    98. int[] gauss = new int[] { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
    99. int width = bmp.getWidth();
    100. int height = bmp.getHeight();
    101. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    102. int pixR = 0;
    103. int pixG = 0;
    104. int pixB = 0;
    105. int pixColor = 0;
    106. int newR = 0;
    107. int newG = 0;
    108. int newB = 0;
    109. int delta = 16; // 值越小图片会越亮,越大则越暗
    110. int idx = 0;
    111. int[] pixels = new int[width * height];
    112. bmp.getPixels(pixels, 0, width, 0, 0, width, height);
    113. for (int i = 1, length = height - 1; i < length; i++)
    114. {
    115. for (int k = 1, len = width - 1; k < len; k++)
    116. {
    117. idx = 0;
    118. for (int m = -1; m <= 1; m++)
    119. {
    120. for (int n = -1; n <= 1; n++)
    121. {
    122. pixColor = pixels[(i + m) * width + k + n];
    123. pixR = Color.red(pixColor);
    124. pixG = Color.green(pixColor);
    125. pixB = Color.blue(pixColor);
    126. newR = newR + (int) (pixR * gauss[idx]);
    127. newG = newG + (int) (pixG * gauss[idx]);
    128. newB = newB + (int) (pixB * gauss[idx]);
    129. idx++;
    130. }
    131. }
    132. newR /= delta;
    133. newG /= delta;
    134. newB /= delta;
    135. newR = Math.min(255, Math.max(0, newR));
    136. newG = Math.min(255, Math.max(0, newG));
    137. newB = Math.min(255, Math.max(0, newB));
    138. pixels[i * width + k] = Color.argb(255, newR, newG, newB);
    139. newR = 0;
    140. newG = 0;
    141. newB = 0;
    142. }
    143. }
    144. bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
    145. long end = System.currentTimeMillis();
    146. Log.d("may", "used time="+(end - start));
    147. return bitmap;
    148. }

最新文章

  1. Python之路-python(html、css)
  2. 【开源】Ionic项目实例《Ionic中文社区》
  3. maketrans translate
  4. jedis提供的功能
  5. JS判断设备终端(PC,iPad,iPhone,android,winPhone)和浏览器
  6. java 属性
  7. Predix Asset Service深度分析
  8. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果
  9. 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
  10. SuperMap iObject入门开发系列七管线横断面分析
  11. HTML第三耍 图像标签
  12. 在git服务器上创建项目过程及遇到的问题
  13. 如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来
  14. .net 读取/保存 文件 到 局域网 服务器
  15. 类与接口(二)java的四种内部类详解
  16. docker 建立私有仓库,24.205为镜像仓库所在主机
  17. 配置toad远程连接oracle
  18. [原]Android 开发第一步
  19. jQuery中的each, data, 插件
  20. 在eclipse中将android工程打包生成apk文件

热门文章

  1. Android控件postDelayed用法,View自带的定时器
  2. Bootstrap-FileInput组件的简单Demo
  3. LightOJ-1282 Leading and Trailing 模算数 快速幂 对数的用法
  4. [Bug]Python3.x SyntaxError: &#39;ascii&#39; codec can&#39;t decode byte 0xe4 in position
  5. Hexo 与 Git 集成
  6. 巧用MAC地址表
  7. 【Henu ACM Round#19 A】 Vasya the Hipster
  8. 洛谷 P3467 [POI2008]PLA-Postering
  9. uva 1292 树形dp
  10. Nginx 性能调优