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

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

下面贴图片:

原图片:

处理后:

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

  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. final int bigW = bm.getWidth();
  15. final int bigH = bm.getHeight();
  16. int wCount = (int) Math.ceil(bigW * 1.0 / smallW);
  17. int hCount = (int) Math.ceil(bigH  * 1.0 / smallH);
  18. // 组合后图片的宽高
  19. int newW = (wCount + 2) * smallW;
  20. int newH = (hCount + 2) * smallH;
  21. // 重新定义大小
  22. Bitmap newBitmap = Bitmap.createBitmap(newW, newH, Config.ARGB_8888);
  23. Canvas canvas = new Canvas(newBitmap);
  24. Paint p = new Paint();
  25. p.setColor(Color.TRANSPARENT);
  26. canvas.drawRect(new Rect(0, 0, newW, newH), p);
  27. Rect rect = new Rect(smallW, smallH, newW - smallW, newH - smallH);
  28. Paint paint = new Paint();
  29. paint.setColor(Color.WHITE);
  30. canvas.drawRect(rect, paint);
  31. // 绘原图
  32. canvas.drawBitmap(bm, (newW - bigW - 2 * smallW) / 2 + smallW, (newH - bigH - 2 * smallH) / 2 + smallH, null);
  33. // 绘边框
  34. // 绘四个角
  35. int startW = newW - smallW;
  36. int startH = newH - smallH;
  37. Bitmap leftTopBm = decodeBitmap(res[0]); // 左上角
  38. Bitmap leftBottomBm = decodeBitmap(res[2]); // 左下角
  39. Bitmap rightBottomBm = decodeBitmap(res[4]); // 右下角
  40. Bitmap rightTopBm = decodeBitmap(res[6]); // 右上角
  41. canvas.drawBitmap(leftTopBm, 0, 0, null);
  42. canvas.drawBitmap(leftBottomBm, 0, startH, null);
  43. canvas.drawBitmap(rightBottomBm, startW, startH, null);
  44. canvas.drawBitmap(rightTopBm, startW, 0, null);
  45. leftTopBm.recycle();
  46. leftTopBm = null;
  47. leftBottomBm.recycle();
  48. leftBottomBm = null;
  49. rightBottomBm.recycle();
  50. rightBottomBm = null;
  51. rightTopBm.recycle();
  52. rightTopBm = null;
  53. // 绘左右边框
  54. Bitmap leftBm = decodeBitmap(res[1]);
  55. Bitmap rightBm = decodeBitmap(res[5]);
  56. for (int i = 0, length = hCount; i < length; i++)
  57. {
  58. int h = smallH * (i + 1);
  59. canvas.drawBitmap(leftBm, 0, h, null);
  60. canvas.drawBitmap(rightBm, startW, h, null);
  61. }
  62. leftBm.recycle();
  63. leftBm = null;
  64. rightBm.recycle();
  65. rightBm = null;
  66. // 绘上下边框
  67. Bitmap bottomBm = decodeBitmap(res[3]);
  68. Bitmap topBm = decodeBitmap(res[7]);
  69. for (int i = 0, length = wCount; i < length; i++)
  70. {
  71. int w = smallW * (i + 1);
  72. canvas.drawBitmap(bottomBm, w, startH, null);
  73. canvas.drawBitmap(topBm, w, 0, null);
  74. }
  75. bottomBm.recycle();
  76. bottomBm = null;
  77. topBm.recycle();
  78. topBm = null;
  79. canvas.save(Canvas.ALL_SAVE_FLAG);
  80. canvas.restore();
  81. return newBitmap;
  82. }

如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。

  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. * @param bmp 被剪切的图片
  18. * @param src 剪切的位置
  19. * @return 剪切后的图片
  20. */
  21. private Bitmap dividePart(Bitmap bmp, Rect src)
  22. {
  23. int width = src.width();
  24. int height = src.height();
  25. Rect des = new Rect(0, 0, width, height);
  26. Bitmap croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
  27. Canvas canvas = new Canvas(croppedImage);
  28. canvas.drawBitmap(bmp, src, des, null);
  29. return croppedImage;
  30. }

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

android图像处理系列之四--给图片添加边框(上)的更多相关文章

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

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  2. android图像处理系列之五-- 给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  3. android图像处理系列之五--给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  4. android图像处理系列之七--图片涂鸦,水印-图片叠加

    图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...

  5. 鼠标滑过图片添加边框图片无位移[xyytit]

    实现下面的效果,鼠标滑过图片添加边框图片无位移——鼠标滑过,图片只是加了边框,不会晃动: 参考代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  6. (转)Android学习-使用Async-Http实现图片压缩并上传功能

    (转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...

  7. android 图像处理系列合集

    为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借 ...

  8. 使用CSS为图片添加边框的几种方法

    css的应用十分广泛,即便用在图片的效果中也是方法多样,本文下面就介绍五种为图片添加特殊效果边框的CSS写法阴影效果 通过使用带有一些padding之的背景图来添加阴影效果. HTML <img ...

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

    前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...

随机推荐

  1. 《机器学习系统设计》之应用scikit-learn做文本分类(上)

    前言: 本系列是在作者学习<机器学习系统设计>([美] WilliRichert)过程中的思考与实践,全书通过Python从数据处理.到特征project,再到模型选择,把机器学习解决这个 ...

  2. android中文网站

    Google Developers中国网站发布 用户评价:  / 55 差好  最后更新于 2016年12月09日 点击数:15209   我们很高兴地宣布,Google Developers 中国网 ...

  3. 15.C语言多线程实现变色龙以及cmd窗口标题变化

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <Wind ...

  4. JWT使用1

    JSON Web Token - 在Web应用间安全地传递信息 转载收藏于:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON ...

  5. js实现日期转换方法

    //方法1function timeStamp1String(time) { var datetime = new Date(); datetime.setTime(time); var year = ...

  6. android图片资源的适配问题

    原文: http://hi.baidu.com/weiyousheng/blog/item/c622d701b9dec6c2277fb5cc.html 在之前的版本中,只有一个drawable,而2. ...

  7. Java经典算法案例

    笔试中的编程题3 JAVA经典算法40例[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? ...

  8. babel的插件

    比如想编译es6的箭头函数,需要使用babel-plugin-transform-es2015-arrow-functions这个插件 此外babel提供了 prests(预设) 相当于是插件的集合 ...

  9. scrollWidth到底是什么???

    贴上MDN对scrollwidth的定义: The Element.scrollWidth read-only property is a measurement of the width of an ...

  10. angularjs input使用ng-model双向绑定无效bug解决

    一.问题描述 当我们给input双向绑定变量的时候,使用ng-model有时候会出现无效的情况 二.解决办法 将绑定的变量写成对象的形式 控制器定义变量: $scope.inputText = {va ...