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

来源:互联网 发布:照片装饰软件下载 编辑:程序博客网 时间:2024/04/29 22:22

图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法。

基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路。也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码。下面的代码主要是给出第一种方法,后一种给出代码,有兴趣的可以自己试试。注意图片不要放到drawable目录下面,因为屏幕分辨率会影响图片的大小,所以最好是放在assets目录里面。下面代码为了简便所以没有那样做。后面一篇还会讲到另一种添加边框图片的方法。

下面贴图片:

原图片:


处理后:


代码(res参数为上面所说的八个边框组合图片资源):

 

[java] view plaincopyprint?
  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(00, 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, 00null);  
  49.         canvas.drawBitmap(leftBottomBm, 0, startH, null);  
  50.         canvas.drawBitmap(rightBottomBm, startW, startH, null);  
  51.         canvas.drawBitmap(rightTopBm, startW, 0null);  
  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, 0null);  
  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 plaincopyprint?
  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(00, 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. }  


处理后图片(原图片还是上面的图片):


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃了海兔的内脏怎么办 吃了鱿鱼的吸盘怎么办 想开个烧烤店没学过怎么办 墨鱼汁弄衣服上怎么办 干鱿鱼泡开发黄怎么办 吃了芥末胃疼怎么办 手撕鱿鱼咸了怎么办 孕妇吃了点芥末怎么办 葡萄酒上面有一层白霉怎么办 手机一不小心把视频删了怎么办 柑橘7月份果实小怎么办 鹦鹉鱼身上有小白点怎么办 鹦鹉鱼身上烂了怎么办 红鹦鹉鱼变黑了怎么办 唱美声总夹嗓子怎么办 发财树树干出褶怎么办 月季花夏天换盆出现黄叶怎么办 刚种的月季枯了怎么办 新买的月季黄叶了怎么办 月季花叶孑轰发黄怎么办? 新种的月季苗弱怎么办? 月季换盆后浇透水叶子黄了怎么办 肉肉移栽后浇透水怎么办 月季花扦插的没长根发芽了怎么办 君子兰发的小苗怎么办 蔷薇光长枝条不开花怎么办 牡丹发芽又干了怎么办 擦皮炎平后皮肤变黑怎么办 误喝发霉的咖啡渣怎么办 狗吃了速溶咖啡怎么办 咖啡机放豆的地方进水怎么办 干吃咖啡粉上瘾怎么办 去良友花艺住宿怎么办 充气娃娃放了气怎么办 煮杜鹃根没有锅怎么办 淘宝店卖鲜花被买家拒收货怎么办 执业医师电子注册忘记密码怎么办 怀孕吃了油炸的怎么办 百合长得太高怎么办 百合的杆没了怎么办 百合花长得太细怎么办