光晕效果

这篇将讲到图片特效处理的图片光晕效果。跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果android图像处理系列之十三--图片特效处理之六-光照效果。实现的效果是圆圈之内图片像素点不变,圆圈之外的点做模糊处理。所以用到了模糊效果和光照效果里面的是否是在圆圈内的算法,可以说是上面提到的两篇的效果的组合。

下面看效果图:

原图:

效果图:

光晕效果看得不是很明显,模糊强度不够,但是还能明显看到图片中有一个圆圈,圈内区域要比圈外区域看得清楚一点(MM的左右脸就可以看到效果)。处理效果不是很理想,在此只能抛砖引玉。下面贴代码:

 

[java] view plaincopy
 
  1. /** 
  2.      * 光晕效果 
  3.      * @param bmp 
  4.      * @param x 光晕中心点在bmp中的x坐标 
  5.      * @param y 光晕中心点在bmp中的y坐标 
  6.      * @param r 光晕的半径 
  7.      * @return 
  8.      */  
  9.     public Bitmap halo(Bitmap bmp, int x, int y, float r)  
  10.     {  
  11.         long start = System.currentTimeMillis();  
  12.         // 高斯矩阵  
  13.         int[] gauss = new int[] { 1, 2, 1, 2, 4, 2, 1, 2, 1 };  
  14.           
  15.         int width = bmp.getWidth();  
  16.         int height = bmp.getHeight();  
  17.         Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);  
  18.           
  19.         int pixR = 0;  
  20.         int pixG = 0;  
  21.         int pixB = 0;  
  22.           
  23.         int pixColor = 0;  
  24.           
  25.         int newR = 0;  
  26.         int newG = 0;  
  27.         int newB = 0;  
  28.           
  29.         int delta = 18; // 值越小图片会越亮,越大则越暗  
  30.           
  31.         int idx = 0;  
  32.         int[] pixels = new int[width * height];  
  33.         bmp.getPixels(pixels, 0, width, 0, 0, width, height);  
  34.         for (int i = 1, length = height - 1; i < length; i++)  
  35.         {  
  36.             for (int k = 1, len = width - 1; k < len; k++)  
  37.             {  
  38.                 idx = 0;  
  39.                 int distance = (int) (Math.pow(k - x, 2) + Math.pow(i - y, 2));  
  40.                 // 不是中心区域的点做模糊处理  
  41.                 if (distance > r * r)  
  42.                 {  
  43.                     for (int m = -1; m <= 1; m++)  
  44.                     {  
  45.                         for (int n = -1; n <= 1; n++)  
  46.                         {  
  47.                             pixColor = pixels[(i + m) * width + k + n];  
  48.                             pixR = Color.red(pixColor);  
  49.                             pixG = Color.green(pixColor);  
  50.                             pixB = Color.blue(pixColor);  
  51.                               
  52.                             newR = newR + (int) (pixR * gauss[idx]);  
  53.                             newG = newG + (int) (pixG * gauss[idx]);  
  54.                             newB = newB + (int) (pixB * gauss[idx]);  
  55.                             idx++;  
  56.                         }  
  57.                     }  
  58.                       
  59.                     newR /= delta;  
  60.                     newG /= delta;  
  61.                     newB /= delta;  
  62.                       
  63.                     newR = Math.min(255, Math.max(0, newR));  
  64.                     newG = Math.min(255, Math.max(0, newG));  
  65.                     newB = Math.min(255, Math.max(0, newB));  
  66.                       
  67.                     pixels[i * width + k] = Color.argb(255, newR, newG, newB);  
  68.                       
  69.                     newR = 0;  
  70.                     newG = 0;  
  71.                     newB = 0;  
  72.                 }  
  73.             }  
  74.         }  
  75.           
  76.         bitmap.setPixels(pixels, 0, width, 0, 0, width, height);  
  77.         long end = System.currentTimeMillis();  
  78.         Log.d("may", "used time="+(end - start));  
  79.         return bitmap;  
  80.     }  

posted on 2014-07-11 15:15  clarenceV1  阅读(400)  评论(0编辑  收藏  举报

导航