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

基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路。也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码。下面的代码主要是给出第一种方法,后一种给出代码,有兴趣的可以自己试试。注意图片不要放到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图像处理系列之二--图片旋转、缩放、反转的图片缩放。如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。如果边框是在一张图片里面,下面给出从一张图片取中间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. CSS鼠标悬停图片加边框效果,不位移的方法

    <!DOCTYPE HTML> <html lang="en-US"> <head> <title>css实现鼠标悬停时图片加边框效 ...

  3. C#实现给图片加边框的方法

    Bitmap bit= new Bitmap(@"" + Path);//给图片加边框 //Bitmap bit = new Bitmap(Screen.AllScreens[0] ...

  4. PHP 给图片加边框

    /** * 给图片加边框 by liangjian 2014-06-19 * @param $ImgUrl 图片地址 * @param $SavePath 新图片保存路径 * @param $px 边 ...

  5. jQuery - 点击图片加边框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法

    CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法 .recomend-list{ width:1200px; a{ @extend %fl; margin-right: 30px; width ...

  7. Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...

  8. Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...

  9. Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide

    一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...

随机推荐

  1. kubernetes学习与实践篇(二) kubernetes1.5 的安装和集群环境部署

    kubernetes 1.5 的安装和集群环境部署 文章转载自:http://www.cnblogs.com/tynia/p/k8s-cluster.html 简介: Docker:是一个开源的应用容 ...

  2. ArchLinux 音乐播放客户端ncmpcpp和服务端mpd的配置

    Ncmcpp是一个mpd客户端,它提供了很多方便的操作 MPD是一个服务器-客户端架构的音频播放器.功能包括音频播放, 播放列表管理和音乐库维护,所有功能占用的资源都很少. --取自 wiki.arc ...

  3. dstat---统计磁盘,CPU,IO,等相关信息

    dstat命令是一个用来替换vmstat.iostat.netstat.nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具.与sysstat相比,dstat拥有一个彩色的界面,在手 ...

  4. vue+element的表格分页和前端搜索

    1.前端后台管理会存在很多表格,表格数据过多就需要分页;2.前端交互每次搜索如果都请求服务器会加大服务器的压力,所以在数据量不是很大的情况下可以一次性将数据返回,前端做检索3.下面贴上一个demo & ...

  5. [JLOI2015]装备购买(线性基)

    [JLOI2015]装备购买 题目描述 脸哥最近在玩一款神奇的游戏,这个游戏里有 nn 件装备,每件装备有 \(m\) 个属性,用向量 \(\mathbf{z_i}\)=\((a_1, \ldots ...

  6. Ubuntu常见报错及解决方式汇总

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  7. An internal error occurred during: &quot;Checking tomcat state&quot;. Error while reading server.xml

    An internal error occurred during: "Checking tomcat state". Error while reading server.xml ...

  8. PostgreSQL数据库创建/删除

    方法1 - 系统命令 sudo su - postgres #切换到postgres用户(系统用户) createdb weichen #创建数据库 psql #直接訪问数据库(默认进入本地postg ...

  9. [BZOJ5305][HAOI2018]苹果树 组合数学

    链接 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C 发现每一天这棵树都会生长出一个新的结点. 第一天的时候, 果树会长出一个根结点, 以后每一天, ...

  10. Hadoop的单节点集群详细启动步骤

    见,如下博客 hadoop-2.2.0.tar.gz的伪分布集群环境搭建(单节点) 很简单,不多赘述.