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

算法

一、简单算法:将像素点周围八个点包括自身一共九个点的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. }

android 图片特效处理之模糊效果的更多相关文章

  1. android图片特效处理之模糊效果

    这篇将讲到图片特效处理的模糊效果.跟前面一样是对像素点进行处理,算法是通用的,但耗时会更长,至于为什么,看了下面的代码你就会明白. 算法: 一.简单算法:将像素点周围八个点包括自身一共九个点的RGB值 ...

  2. android 图片特效处理之 光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  3. android 图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  4. android图片特效处理之光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  5. android 图片特效处理之 图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  6. android 图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

  7. android 图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  8. android图片特效处理之怀旧效果

    图片特效处理系列将介绍图片的像素点的特效处理,这些物资注重的是原理.也就是说只要你知道这些算法不管是C++,VB,C#,Java都可以做出相同的特效.下面将介绍图片怀旧效果的算法.算法如下: 上面公式 ...

  9. android图片特效处理之图片叠加

    这篇将讲到图片特效处理的图片叠加效果.跟前面一样是对像素点进行处理,可参照前面的android图像处理系列之七--图片涂鸦,水印-图片叠加和android图像处理系列之六--给图片添加边框(下)-图片 ...

随机推荐

  1. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

  2. PHP接收GET中文参数乱码的原因及解决方案

    方案1: $str = iconv("gb2312","utf-8",$str); 方案2: mb_convert_encoding($str, "u ...

  3. WLAN 基础架构功能

    WLAN 基础架构功能 Android WLAN 框架可帮助用户连接到优质 WLAN 网络(在有可用 WLAN 网络且需要连接到这类网络的情况下).Android 可通过多种方式来实现这一点: 打开网 ...

  4. javascript--记忆函数

    function memory(val) { if(!memory.cached) {//判断是否创建了缓存 memory.cached = {}; } if(memory.cached[val] ! ...

  5. docker切换默认镜像源

    docker切换默认镜像源   基于 debian8 默认安装的 docker 镜像源是在国外,pull 镜像的时候奇慢无比,需要自己手动切换成国内的镜像源. 1. 修改配置文件 docker 默认的 ...

  6. bzoj1293 [SCOI2009] 生日礼物 队列

    题目描述 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在 ...

  7. linux指令快速复制粘贴[龟速更新中]

    由于有经常碰到要输入linux指令,但是却忘记了的情况.在家里我把常用的命令放到Xshell的快速命令集,但是在很多情况下不在家,可能用的他人电脑,以及在非Win环境下使用ssh时没有xshell使用 ...

  8. caioj 1081 动态规划入门(非常规DP5:观光游览)

    这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...

  9. 【计算机视觉】基于Kalman滤波器的进行物体的跟踪

    预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能 ...

  10. Servlet具体解释

    Servlet具体解释 基本概述 Session在计算机中,尤其是在网络应用中,称为"会话控制".在计算机专业术语中.Session是指一个终端用户与交互系统进行通信的时间间隔,通 ...