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

处理后:

代码(res参数为上面所说的八个边框组合图片资源):
- /**
- * 图片与边框组合
- * @param bm 原图片
- * @param res 边框资源
- * @return
- */
- private Bitmap combinateFrame(Bitmap bm, int[] res)
- {
- Bitmap bmp = decodeBitmap(res[0]);
- // 边框的宽高
- final int smallW = bmp.getWidth();
- final int smallH = bmp.getHeight();
- // 原图片的宽高
- final int bigW = bm.getWidth();
- final int bigH = bm.getHeight();
- int wCount = (int) Math.ceil(bigW * 1.0 / smallW);
- int hCount = (int) Math.ceil(bigH * 1.0 / smallH);
- // 组合后图片的宽高
- int newW = (wCount + 2) * smallW;
- int newH = (hCount + 2) * smallH;
- // 重新定义大小
- Bitmap newBitmap = Bitmap.createBitmap(newW, newH, Config.ARGB_8888);
- Canvas canvas = new Canvas(newBitmap);
- Paint p = new Paint();
- p.setColor(Color.TRANSPARENT);
- canvas.drawRect(new Rect(0, 0, newW, newH), p);
- Rect rect = new Rect(smallW, smallH, newW - smallW, newH - smallH);
- Paint paint = new Paint();
- paint.setColor(Color.WHITE);
- canvas.drawRect(rect, paint);
- // 绘原图
- canvas.drawBitmap(bm, (newW - bigW - 2 * smallW) / 2 + smallW, (newH - bigH - 2 * smallH) / 2 + smallH, null);
- // 绘边框
- // 绘四个角
- int startW = newW - smallW;
- int startH = newH - smallH;
- Bitmap leftTopBm = decodeBitmap(res[0]); // 左上角
- Bitmap leftBottomBm = decodeBitmap(res[2]); // 左下角
- Bitmap rightBottomBm = decodeBitmap(res[4]); // 右下角
- Bitmap rightTopBm = decodeBitmap(res[6]); // 右上角
- canvas.drawBitmap(leftTopBm, 0, 0, null);
- canvas.drawBitmap(leftBottomBm, 0, startH, null);
- canvas.drawBitmap(rightBottomBm, startW, startH, null);
- canvas.drawBitmap(rightTopBm, startW, 0, null);
- leftTopBm.recycle();
- leftTopBm = null;
- leftBottomBm.recycle();
- leftBottomBm = null;
- rightBottomBm.recycle();
- rightBottomBm = null;
- rightTopBm.recycle();
- rightTopBm = null;
- // 绘左右边框
- Bitmap leftBm = decodeBitmap(res[1]);
- Bitmap rightBm = decodeBitmap(res[5]);
- for (int i = 0, length = hCount; i < length; i++)
- {
- int h = smallH * (i + 1);
- canvas.drawBitmap(leftBm, 0, h, null);
- canvas.drawBitmap(rightBm, startW, h, null);
- }
- leftBm.recycle();
- leftBm = null;
- rightBm.recycle();
- rightBm = null;
- // 绘上下边框
- Bitmap bottomBm = decodeBitmap(res[3]);
- Bitmap topBm = decodeBitmap(res[7]);
- for (int i = 0, length = wCount; i < length; i++)
- {
- int w = smallW * (i + 1);
- canvas.drawBitmap(bottomBm, w, startH, null);
- canvas.drawBitmap(topBm, w, 0, null);
- }
- bottomBm.recycle();
- bottomBm = null;
- topBm.recycle();
- topBm = null;
- canvas.save(Canvas.ALL_SAVE_FLAG);
- canvas.restore();
- return newBitmap;
- }
如果边框是在一张图片里面,下面给出从一张图片取中间200X200的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。
- /**
- * 截取图片的中间的200X200的区域
- * @param bm
- * @return
- */
- private Bitmap cropCenter(Bitmap bm)
- {
- int dstWidth = 200;
- int dstHeight = 200;
- int startWidth = (bm.getWidth() - dstWidth)/2;
- int startHeight = ((bm.getHeight() - dstHeight) / 2);
- Rect src = new Rect(startWidth, startHeight, startWidth + dstWidth, startHeight + dstHeight);
- return dividePart(bm, src);
- }
- /**
- * 剪切图片
- * @param bmp 被剪切的图片
- * @param src 剪切的位置
- * @return 剪切后的图片
- */
- private Bitmap dividePart(Bitmap bmp, Rect src)
- {
- int width = src.width();
- int height = src.height();
- Rect des = new Rect(0, 0, width, height);
- Bitmap croppedImage = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
- Canvas canvas = new Canvas(croppedImage);
- canvas.drawBitmap(bmp, src, des, null);
- return croppedImage;
- }
处理后图片(原图片还是上面的图片):

android图像处理系列之四--给图片添加边框(上)的更多相关文章
- android图像处理系列之四-- 给图片添加边框(上)
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- android图像处理系列之五-- 给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- android图像处理系列之五--给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- android图像处理系列之七--图片涂鸦,水印-图片叠加
图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...
- 鼠标滑过图片添加边框图片无位移[xyytit]
实现下面的效果,鼠标滑过图片添加边框图片无位移——鼠标滑过,图片只是加了边框,不会晃动: 参考代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- (转)Android学习-使用Async-Http实现图片压缩并上传功能
(转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...
- android 图像处理系列合集
为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借 ...
- 使用CSS为图片添加边框的几种方法
css的应用十分广泛,即便用在图片的效果中也是方法多样,本文下面就介绍五种为图片添加特殊效果边框的CSS写法阴影效果 通过使用带有一些padding之的背景图来添加阴影效果. HTML <img ...
- android图像处理系列之六-- 给图片添加边框(下)-图片叠加
前面介绍了一种用透明图片叠加的方式添加花边边框,下面将介绍另外一种图片叠加添加花边边框的方式.前面方法有一个缺点,就是做成PNG图片,图片体积会很大,不是一般的大,比同样的JPG大三倍多,如果项目可以 ...
随机推荐
- 【习题 8-20 UVA-1620】Lazy Susan
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现,如果把连续4个数字进行一次翻转的话. 假设这连续的4个数字的逆序数为x; 那么翻转过后,逆序数就会变成6-x; (最多6个逆 ...
- 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading
[题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...
- 洛谷 P3663 [USACO17FEB]Why Did the Cow Cross the Road III S
P3663 [USACO17FEB]Why Did the Cow Cross the Road III S 题目描述 Why did the cow cross the road? Well, on ...
- ArcGIS api for javascript——地图配置-定制平移动画
描述 本例展示了当用户点击平移按钮时如何定制地图的动画.panDuration和panRate是Dojo动画属性,可以分别确定动画的duration和帧刷新的rate.这些属性的单位都是毫秒,panD ...
- typedef 与 set_new_handler的几种写法
可以用Command模式.函数对象来代替函数指针,获得以下的好处: 1. 可以封装数据 2. 可以通过虚拟成员获得函数的多态性 3. 可以处理类层次结果,将Command与Prototype模式相结合 ...
- CKEditor高级编辑器
是否感觉后台分类描写叙述信息.商品描写叙述信息以及文章描写叙述信息 编写时很的不方便?有时候会将word的格式也复制过来了?那这个插件就比較适合了. 本插件使用CKEditor最新版本号,复制过来的内 ...
- DF标志和串移动指令(movsb/movsw)
1.标志寄存器的第10位DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si.di添加 DF=1,每次操作后,si.di减小 我们能够用汇编语法描写叙述movs ...
- uestc 94(区间更新)
题意:有一个字符串全部由'('和')'组成.然后有三种操作,query a b输出区间[a,b]字符串的括号序列是否合法.reverse a b把区间[a,b]字符串里全部'('替换成')',而且把全 ...
- Perl Learning 5 Hash
[本文原创,未经同意请勿转载] 哈希是一种数据结构,它和数组的相似之处在于能够容纳随意多的值并能按需取用,而它和数组的不同在于索引方式,数组是以数字来索引.哈希则以名字来索引.也就是说.哈希的索引值, ...
- CentOS6 安装 aria2
CentOS6 安装 aria2 https://www.jianshu.com/p/31ea7aba5524 http://blog.51cto.com/skypegnu1/1637168 1.先安 ...