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

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

    [题目链接]:https://csacademy.com/contest/round-36/task/socks-pairs/ [题意] 给你n种颜色的袜子,每种颜色颜色的袜子有ai只; 假设你在取袜 ...

  2. linux 下查看二进制文件

    查看二进制有以下几种方法: 方法一:hexdump apt-get install libdata-hexdumper-perl 安装好之后就可以直接hexdump your_binary_file ...

  3. 第五章,AsyncTask和ProgressBar的练习(Android)

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  4. 面对即将终止支持的server你还能做些什么

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXF1c2hp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  5. hdoj2066一个人的旅行

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  6. HIT 2255 Not Fibonacci(矩阵高速幂)

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; cons ...

  7. strchr函数的实现而不是使用

    刚刚在写一个程序的时候突然须要用到定位到一个字符串中第一次出现某个字符的位置,于是就找到了strchr()函数,之前从没实用过的,^_^当然我能够直接调用就可以.可是拥有良好程序素质的洗衣袋决定要想实 ...

  8. rman数据库恢复;关键/非重要文件、影像副本、控制文件、还原点、非归档、增量、新数据库、灾难性回复

    运行全然恢复:在 ARCHIVELOG 模式下 丢失了系统重要数据文件: 假设某个数据文件丢失或损坏.且该文件属于 SYSTEM 或 UNDO 表空间,请运行下面步骤: 1. 实例可能会也可能不会自己 ...

  9. android-Animation进阶(创造用户舒服的动画)

    android中经常使用的动画有Animation ,Animator两种; ---第1种经常使用的是使用在Activity切换中.比方打开一个Activity.关闭一个Activity 个人比較喜欢 ...

  10. perl编程问题

    一.Hash类型 1.hash遍历输出:如果hash遍历输出的时候不是按key则会按数组输出. my %hash=(); ${hash}{"a"}="1"; $ ...