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

算法

一、简单算法:将像素点周围八个点包括自身一共九个点的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. POJ-2393 Yogurt factory 贪心问题

    题目链接:https://cn.vjudge.net/problem/POJ-2393 题意 有一个生产酸奶的工厂,还有一个酸奶放在其中不会坏的储存室 每一单元酸奶存放价格为每周s元,在接下来的N周时 ...

  2. java 基于 bootstrap_datagrid 分页

    1.首先引入datagrid  js ,css $("#datagrid").bootstrap_datagrid({ url : "<%=path%>/us ...

  3. next.js、nuxt.js等服务端渲染框架构建的项目部署到服务器,并用PM2守护程序

    前端渲染:vue.react等单页面项目应该这样子部署到服务器 貌似从前几年,前后端分离逐渐就开始流行起来,把一些渲染计算的工作抛向前端以便减轻服务端的压力,但为啥现在又开始流行在服务端渲染了呢?如v ...

  4. python第三次作业——叶耀宗

    作业1 import random#引入随机数模块xing=["小白","小黄","小王","小陈","小绿& ...

  5. 【Educational Codeforces Round 37 E】Connected Components?

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs. 用一个链表来记录哪些点已经确定在某一个联通快里了. 一开始每个点都能用. 然后从第一个点开始进行bfs. 然后对于它的所有 ...

  6. Snail—UI学习之导航视图控制器UINavigationController(系统)

    背景 有一个根视图控制器 然后跳转到第一个界面  第一个界面能够返回到根视图 也能够跳转到第二个视图 第二个视图能够直接返回到根视图 新建三个ViewController    RootViewCon ...

  7. 一起talk C栗子吧(第八十一回:C语言实例--进程停止)

    各位看官们,大家好,上一回中咱们说的是进程相互排斥的样例,这一回咱们说的样例是:进程停止.闲话休提,言归正转. 让我们一起talk C栗子吧! 我们在前面的章回中介绍了怎样创建进程,只是没有介绍停止进 ...

  8. type &#39;simple Class&#39; does not conform to protocol &#39;Example Protocol&#39;错误

    在看swift教程中"接口和扩展"这小部分. 在编写时提示"type 'simple Class' does not conform to protocol 'Examp ...

  9. CCNP路由实验之十 组播(多播)

                        CCNP路由实验之十 组播(多播) 种方法: 在交换机上配置静态的多播MAC地址到用户接口的映射 使用CGMP.执行CGMP的多播路由器能够将用户发送给自己 ...

  10. Windows系统时间同步出错解决办法(w32tm /register按回车,可能是为了解决时间COM注册的问题)

    有时候我们设置本地时间与Internet时间同步时,经常连接服务器time.windows.com超时,导致时间同步失败,解决办法如下: 利用快捷键"Win+R"调出运行框,输入: ...