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

前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式。前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以忽略包的大小,那么可以用前种处理方式,本文讲到的虽然可以减小图片的体积,但处理较复杂,而且本人研究的还不是很成熟。本文就是针对JPG边框处理,但缺点是还不够成熟,仅提供思路。

思路:可以将边框做成JPG图片,没有边框的地方,一般都是中间区域调成特殊颜色,比如黑色。在两张图片叠加的时候,对边框图片做特殊处理,比如是黑色的点过滤掉,改变边框图片像素点的透明度,即可完成前面PNG图片的效果。

下面看效果:

+

目前代码处理的还不是很好,非黑色点与黑色点的交界处没有做模糊处理,具体方法后面的文章会讲到。一样的边框图片建议放在assets目录。

下面贴代码:

  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多倍。因为这种图片叠加是对像素点处理,是后面的特效处理系列,因为涉及到图片叠加,所以放到前面来。具体怎么使用,后面也会很快讨论到,读者也可以自己研究。优化的代码会在后面贴出来,敬请期待。

posted @ 2017-04-17 11:37  brave-sailor  阅读(663)  评论(0编辑  收藏  举报