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

算法

一、简单算法:将像素点周围八个点包括自身一共九个点的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. 33.unique_ptr独享内存智能指针

    #include <iostream> #include <memory> #include <string> #include <vector> us ...

  2. java9新特性-18-统一的JVM日志系统

    1.官方Feature 158: Unified JVM Logging 271: Unified GC Logging 2.使用说明 日志是解决问题的唯一有效途径:曾经很难知道导致JVM性能问题和导 ...

  3. C#-汉字转拼音缩写

    /// 〈summary〉 /// 汉字转拼音缩写 /// Code By MuseStudio@hotmail.com /// 2004-11-30 /// 〈/summary〉 /// 〈para ...

  4. Android5.0之后的页面切换动画

    Android5.0之后给我们开发者剩了好多的事情,为什么这么说呢?还记得刚开始的时候,Android里面的所有的动画都要我们开发者自己来写,现在不需要了,因为5.0之后自带了好多的动画,比如:按钮点 ...

  5. Vue总结(三)

    Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来. var App = new Vue({ el: "#root", data: { m ...

  6. vue组件递归的一些理解

    自己做个小项目练手,需要用到组件递归,网上查了一些资料,每个代码片段都认识,但是连起来,就一团浆糊. 既然人傻就多思考吧.不明白的点有以下: 1.组件怎么自己调用自己,函数的递归是就是在functio ...

  7. Python爬虫基础示例

    使用pip安装相关依赖: pip install requests pip install bs4 安装成功提示:Successfully installed *... 爬取中国天气网数据示例代码: ...

  8. 监控mysqld服务

    #!/bin/bash #监控mysqld服务 #telnet 192.168.122.171 3306 | grep Connected | wc -l #远程检查 #num=`netstat -n ...

  9. 洛谷 P1125 笨小猴

    P1125 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设max ...

  10. 二 MapReduce 各阶段流程分析

    如果想要将问题变得清晰.精准和优雅, 需要关注 MapReduce 作业所需要的系统资源,尤其是集群内部网络资源使用情况. MR 可以运行在共享集群上处理 TB 级 甚至 PB 级的数据.同时,改作业 ...