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

基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路。也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码。下面的代码主要是给出第一种方法,后一种给出代码,有兴趣的可以自己试试。注意图片不要放到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. 8.变量内存CPU原理

    编译器先明确是什么类型,然后明确变量名,变量表管理所有的变量,不在变量表内部的变量不能引用.每个变量对应一整块内存 a+1所计算出来的值在寄存器中,只有变量可以被赋值,变量必须在内存里面 c语言内嵌汇 ...

  2. Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers

    原文地址:https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-compariso ...

  3. IDEA中FindBugs编码规范工具使用

    IDEA中安装FindBugs插件: file--Settings--Plugins 在Plugins搜索FindBugs: 安装完成后在项目中选中文件右键找到findBugs: 检查代码结果: 按照 ...

  4. Android 两步搞定Fragment的返回键

    Fragment可以说是在Android开发必需要使用到技术,项目中的界面基本上都是使用Fragment来实现,而Activity只是作为Fragment的载体,但有些特殊情况下Fragment也不得 ...

  5. sql server 中查询数据库下有多少张表以及同义词等信息

    --查询数据库有多少张表SELECT count(0) from sysobjects where xtype = 'u' 复制代码 解释:sysobjects系统对象表. 保存当前数据库的对象.如约 ...

  6. caffe(9) caffe例子

    为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...

  7. TortoiseGit 弹出 git@xxx.com's password 对话框

    安装完 tortoise git,用它克隆项目的时候,一直弹出git@xxx.com's password 对话框 解决的办法是,将ssh客户端默认的路径,换为git 安装目录下ssh.exe的路径就 ...

  8. What is x86 Conforming Code Segment?

    SRC=Microprocessor Based Systems SRC=Computer Architecture: A Quantitative Approach

  9. 洛谷 P1071 潜伏者

    P1071 潜伏者 题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S ...

  10. 热门游戏&lt;开心消消乐&gt;的“加壳”诡计!!

    好久没搞游戏了,前几天看了又又一次看了看<开心消消乐>的1.29最新版..于是故事開始了: 1.反编译分析 首先使用Androidkiller进行反编译,得到两个Smali代码目录:mal ...