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

识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述android图片特效处理之光晕效果相关的知识,希望能为你提供帮助。
这篇将讲到图片特效处理的图片光晕效果。跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之六-光照效果。实现的效果是圆圈之内图片像素点不变,圆圈之外的点做模糊处理。所以用到了模糊效果和光照效果里面的是否是在圆圈内的算法,可以说是上面提到的两篇的效果的组合。
下面看效果图:
原图:

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

文章图片


效果图:
android图片特效处理之光晕效果

文章图片


光晕效果看得不是很明显,模糊强度不够,但是还能明显看到图片中有一个圆圈,圈内区域要比圈外区域看得清楚一点(MM的左右脸就可以看到效果)。处理效果不是很理想,在此只能抛砖引玉。下面贴代码:
 
[java] view plain copy
  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.         }   
【android图片特效处理之光晕效果】 



    推荐阅读