android图像处理系列之六--给图片添加边框(下)-图片叠加

【android图像处理系列之六--给图片添加边框(下)-图片叠加】古人已用三冬足,年少今开万卷余。这篇文章主要讲述android图像处理系列之六--给图片添加边框(下)-图片叠加相关的知识,希望能为你提供帮助。
前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式。前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以忽略包的大小,那么可以用前种处理方式,本文讲到的虽然可以减小图片的体积,但处理较复杂,而且本人研究的还不是很成熟。本文就是针对JPG边框处理,但缺点是还不够成熟,仅提供思路。
思路:可以将边框做成JPG图片,没有边框的地方,一般都是中间区域调成特殊颜色,比如黑色。在两张图片叠加的时候,对边框图片做特殊处理,比如是黑色的点过滤掉,改变边框图片像素点的透明度,即可完成前面PNG图片的效果。
下面看效果:

android图像处理系列之六--给图片添加边框(下)-图片叠加

文章图片
+
android图像处理系列之六--给图片添加边框(下)-图片叠加

文章图片
android图像处理系列之六--给图片添加边框(下)-图片叠加

文章图片


目前代码处理的还不是很好,非黑色点与黑色点的交界处没有做模糊处理,具体方法后面的文章会讲到。一样的边框图片建议放在assets目录。
下面贴代码:
[java] view plain copy
  1. < pre  name="code"  class="java"> /** 
  2.           *  叠加边框图片有用部分 
  3.           *  @param  bmp 
  4.           *  @return 
  5.           */   
  6.         private  Bitmap  alphaLayer(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.                    
  12.                 //  边框图片   
  13.                 Bitmap  overlay  =  BitmapFactory.decodeResource(mContext.getResources(),  R.drawable.black);    
  14.                 int  w  =  overlay.getWidth();    
  15.                 int  h  =  overlay.getHeight();    
  16.                 float  scaleX  =  width  *  1F  /  w;    
  17.                 float  scaleY  =  height  *  1F  /  h;    
  18.                 Matrix  matrix  =  new  Matrix();    
  19.                 matrix.postScale(scaleX,  scaleY);    
  20.                    
  21.                 Bitmap  overlayCopy  =  Bitmap.createBitmap(overlay,  0,  0,  w,  h,  matrix,  true);    
  22.                    
  23.                 int  pixColor  =  0;    
  24.                 int  layColor  =  0;    
  25.                 int  newColor  =  0;    
  26.                    
  27.                 int  pixR  =  0;    
  28.                 int  pixG  =  0;    
  29.                 int  pixB  =  0;    
  30.                 int  pixA  =  0;    
  31.                    
  32.                 int  newR  =  0;    
  33.                 int  newG  =  0;    
  34.                 int  newB  =  0;    
  35.                 int  newA  =  0;    
  36.                    
  37.                 int  layR  =  0;    
  38.                 int  layG  =  0;    
  39.                 int  layB  =  0;    
  40.                 int  layA  =  0;    
  41.                    
  42.                 float  alpha  =  0.3F;    
  43.                 float  alphaR  =  0F;    
  44.                 float  alphaG  =  0F;    
  45.                 float  alphaB  =  0F;    
  46.                 for  (int  i  =  0;   i  <   width;   i++)   
  47.                 {   
  48.                         for  (int  k  =  0;   k  <   height;   k++)   
  49.                         {   
  50.                                 pixColor  =  bmp.getPixel(i,  k);    
  51.                                 layColor  =  overlayCopy.getPixel(i,  k);    
  52.                                    
  53.                                 //  获取原图片的RGBA值   
  54.                                 pixR  =  Color.red(pixColor);    
  55.                                 pixG  =  Color.green(pixColor);    
  56.                                 pixB  =  Color.blue(pixColor);    
  57.                                 pixA  =  Color.alpha(pixColor);    
  58.                                    
  59.                                 //  获取边框图片的RGBA值   
  60.                                 layR  =  Color.red(layColor);    
  61.                                 layG  =  Color.green(layColor);    
  62.                                 layB  =  Color.blue(layColor);    
  63.                                 layA  =  Color.alpha(layColor);    
  64.                                    
  65.                                 //  颜色与纯黑色相近的点   
  66.                                 if  (layR  <   20  & &   layG  <   20  & &   layB  <   20)   
  67.                                 {   
  68.                                         alpha  =  1F;    
  69.                                 }   
  70.                                 else   
  71.                                 {   
  72.                                         alpha  =  0.3F;    
  73.                                 }   
  74.                                    
  75.                                 alphaR  =  alpha;    
  76.                                 alphaG  =  alpha;    
  77.                                 alphaB  =  alpha;    
  78.                                    
  79.                                 //  两种颜色叠加   
  80.                                 newR  =  (int)  (pixR  *  alphaR  +  layR  *  (1  -  alphaR));    
  81.                                 newG  =  (int)  (pixG  *  alphaG  +  layG  *  (1  -  alphaG));    
  82.                                 newB  =  (int)  (pixB  *  alphaB  +  layB  *  (1  -  alphaB));    
  83.                                 layA  =  (int)  (pixA  *  alpha  +  layA  *  (1  -  alpha));    
  84.                                    
  85.                                 //  值在0~255之间   
  86.                                 newR  =  Math.min(255,  Math.max(0,  newR));    
  87.                                 newG  =  Math.min(255,  Math.max(0,  newG));    
  88.                                 newB  =  Math.min(255,  Math.max(0,  newB));    
  89.                                 newA  =  Math.min(255,  Math.max(0,  layA));    
  90.                                    
  91.                                 newColor  =  Color.argb(newA,  newR,  newG,  newB);    
  92.                                 bitmap.setPixel(i,  k,  newColor);    
  93.                         }   
  94.                 }   
  95.                    
  96.                    
  97.                 return  bitmap;    
  98.         }   

 
这种方式图片处理比较慢,因为像素点要一个个getPixel(),组成新图片的时候要一个个setPixel()。另外可以用getPixels(),和setPixels()方法,这种处理要快一点,本人对其它类似效果的处理测试了一下,后面处理方式要比前面快3多倍。因为这种图片叠加是对像素点处理,是后面的特效处理系列,因为涉及到图片叠加,所以放到前面来。具体怎么使用,后面也会很快讨论到,读者也可以自己研究。优化的代码会在后面贴出来,敬请期待。



    推荐阅读