android图像处理系列之四-- 给图片添加边框(上)

幽映每白日,清辉照衣裳。这篇文章主要讲述android图像处理系列之四-- 给图片添加边框(上)相关的知识,希望能为你提供帮助。
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法。
基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路。也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码。下面的代码主要是给出第一种方法,后一种给出代码,有兴趣的可以自己试试。注意图片不要放到drawable目录下面,因为屏幕分辨率会影响图片的大小,所以最好是放在assets目录里面。下面代码为了简便所以没有那样做。后面一篇还会讲到另一种添加边框图片的方法。
下面贴图片:
【android图像处理系列之四-- 给图片添加边框(上)】原图片:

android图像处理系列之四-- 给图片添加边框(上)

文章图片


处理后:
android图像处理系列之四-- 给图片添加边框(上)

文章图片


代码(res参数为上面所说的八个边框组合图片资源):
 
[java] view plain copy
  1. /** 
  2.           *  图片与边框组合 
  3.           *  @param  bm  原图片 
  4.           *  @param  res  边框资源 
  5.           *  @return 
  6.           */   
  7.         private  Bitmap  combinateFrame(Bitmap  bm,  int[]  res)   
  8.         {   
  9.                 Bitmap  bmp  =  decodeBitmap(res[0]);    
  10.                 //  边框的宽高   
  11.                 final  int  smallW  =  bmp.getWidth();    
  12.                 final  int  smallH  =  bmp.getHeight();    
  13.                    
  14.                 //  原图片的宽高   
  15.                 final  int  bigW  =  bm.getWidth();    
  16.                 final  int  bigH  =  bm.getHeight();    
  17.                    
  18.                 int  wCount  =  (int)  Math.ceil(bigW  *  1.0  /  smallW);    
  19.                 int  hCount  =  (int)  Math.ceil(bigH    *  1.0  /  smallH);    
  20.                    
  21.                 //  组合后图片的宽高   
  22.                 int  newW  =  (wCount  +  2)  *  smallW;    
  23.                 int  newH  =  (hCount  +  2)  *  smallH;    
  24.                    
  25.                 //  重新定义大小   
  26.                 Bitmap  newBitmap  =  Bitmap.createBitmap(newW,  newH,  Config.ARGB_8888);    
  27.                 Canvas  canvas  =  new  Canvas(newBitmap);    
  28.                 Paint  p  =  new  Paint();    
  29.                 p.setColor(Color.TRANSPARENT);    
  30.                 canvas.drawRect(new  Rect(0,  0,  newW,  newH),  p);    
  31.                    
  32.                 Rect  rect  =  new  Rect(smallW,  smallH,  newW  -  smallW,  newH  -  smallH);    
  33.                 Paint  paint  =  new  Paint();    
  34.                 paint.setColor(Color.WHITE);    
  35.                 canvas.drawRect(rect,  paint);    
  36.                    
  37.                 //  绘原图   
  38.                 canvas.drawBitmap(bm,  (newW  -  bigW  -  2  *  smallW)  /  2  +  smallW,  (newH  -  bigH  -  2  *  smallH)  /  2  +  smallH,  null);    
  39.                 //  绘边框   
  40.                 //  绘四个角   
  41.                 int  startW  =  newW  -  smallW;    
  42.                 int  startH  =  newH  -  smallH;    
  43.                 Bitmap  leftTopBm  =  decodeBitmap(res[0]);   //  左上角   
  44.                 Bitmap  leftBottomBm  =  decodeBitmap(res[2]);   //  左下角   
  45.                 Bitmap  rightBottomBm  =  decodeBitmap(res[4]);   //  右下角   
  46.                 Bitmap  rightTopBm  =  decodeBitmap(res[6]);   //  右上角   
  47.                    
  48.                 canvas.drawBitmap(leftTopBm,  0,  0,  null);    
  49.                 canvas.drawBitmap(leftBottomBm,  0,  startH,  null);    
  50.                 canvas.drawBitmap(rightBottomBm,  startW,  startH,  null);    
  51.                 canvas.drawBitmap(rightTopBm,  startW,  0,  null);    
  52.                    
  53.                 leftTopBm.recycle();    
  54.                 leftTopBm  =  null;    
  55.                 leftBottomBm.recycle();    
  56.                 leftBottomBm  =  null;    
  57.                 rightBottomBm.recycle();    
  58.                 rightBottomBm  =  null;    
  59.                 rightTopBm.recycle();    
  60.                 rightTopBm  =  null;    
  61.                    
  62.                 //  绘左右边框   
  63.                 Bitmap  leftBm  =  decodeBitmap(res[1]);    
  64.                 Bitmap  rightBm  =  decodeBitmap(res[5]);    
  65.                 for  (int  i  =  0,  length  =  hCount;   i  <   length;   i++)   
  66.                 {   
  67.                         int  h  =  smallH  *  (i  +  1);    
  68.                         canvas.drawBitmap(leftBm,  0,  h,  null);    
  69.                         canvas.drawBitmap(rightBm,  startW,  h,  null);    
  70.                 }   
  71.                    
  72.                 leftBm.recycle();    
  73.                 leftBm  =  null;    
  74.                 rightBm.recycle();    
  75.                 rightBm  =  null;    
  76.                    
  77.                 //  绘上下边框   
  78.                 Bitmap  bottomBm  =  decodeBitmap(res[3]);    
  79.                 Bitmap  topBm  =  decodeBitmap(res[7]);    
  80.                 for  (int  i  =  0,  length  =  wCount;   i  <   length;   i++)   
  81.                 {   
  82.                         int  w  =  smallW  *  (i  +  1);    
  83.                         canvas.drawBitmap(bottomBm,  w,  startH,  null);    
  84.                         canvas.drawBitmap(topBm,  w,  0,  null);    
  85.                 }   
  86.                    
  87.                 bottomBm.recycle();    
  88.                 bottomBm  =  null;    
  89.                 topBm.recycle();    
  90.                 topBm  =  null;    
  91.                    
  92.                 canvas.save(Canvas.ALL_SAVE_FLAG);    
  93.                 canvas.restore();    
  94.                    
  95.                 return  newBitmap;    
  96.         }   

如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。
[java] view plain copy
  1. /** 
  2.   *  截取图片的中间的200X200的区域 
  3.   *  @param  bm 
  4.   *  @return 
  5.   */   
  6. private  Bitmap  cropCenter(Bitmap  bm)   
  7. {   
  8.         int  dstWidth  =  200;    
  9.               int  dstHeight  =  200;    
  10.               int  startWidth  =  (bm.getWidth()  -  dstWidth)/2;    
  11.               int  startHeight  =  ((bm.getHeight()  -  dstHeight)  /  2);    
  12.               Rect  src  =  new  Rect(startWidth,  startHeight,  startWidth  +  dstWidth,  startHeight  +  dstHeight);    
  13.               return  dividePart(bm,  src);    
  14. }   
  15.    
  16. /** 
  17.   *  剪切图片 
  18.   *  @param  bmp  被剪切的图片 
  19.   *  @param  src  剪切的位置 
  20.   *  @return  剪切后的图片 
  21.   */   
  22. private  Bitmap  dividePart(Bitmap  bmp,  Rect  src)   
  23. {   
  24.         int  width  =  src.width();    
  25.         int  height  =  src.height();    
  26.         Rect  des  =  new  Rect(0,  0,  width,  height);    
  27.         Bitmap  croppedImage  =  Bitmap.createBitmap(width,  height,  Bitmap.Config.RGB_565);    
  28.         Canvas  canvas  =  new  Canvas(croppedImage);    
  29.         canvas.drawBitmap(bmp,  src,  des,  null);    
  30.         return  croppedImage;    
  31. }   

处理后图片(原图片还是上面的图片):
android图像处理系列之四-- 给图片添加边框(上)

文章图片






    推荐阅读