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的区域。如何类似边框过多,可以将裁剪的信息写入到指定的文件,裁剪时可先将边框图片信息读取出来,然后再裁剪出边框。如果处理的原图片太大,可能会出内存溢出。可先将图片缩小到一定尺寸再处理,具体缩小方法,参见android图像处理系列之二--图片旋转、缩放、反转的图片缩放。如果边框是在一张图片里面,下面给出从一张图片取中间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 给图片加边框
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- CSS鼠标悬停图片加边框效果,不位移的方法
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>css实现鼠标悬停时图片加边框效 ...
- C#实现给图片加边框的方法
Bitmap bit= new Bitmap(@"" + Path);//给图片加边框 //Bitmap bit = new Bitmap(Screen.AllScreens[0] ...
- PHP 给图片加边框
/** * 给图片加边框 by liangjian 2014-06-19 * @param $ImgUrl 图片地址 * @param $SavePath 新图片保存路径 * @param $px 边 ...
- jQuery - 点击图片加边框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法
CSS鼠标悬停图片加边框效果,页面布局发生错位的解决办法 .recomend-list{ width:1200px; a{ @extend %fl; margin-right: 30px; width ...
- Android之图片加载框架Fresco基本使用(一)
PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...
- Android之图片加载框架Fresco基本使用(二)
PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...
- Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide
一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...
随机推荐
- Laravel-路由组和中间件
Laravel-路由组和中间件 标签(空格分隔): php 定义路由组 Route::group(['prefix'=>'Anime'], function(){ Rout::match(['g ...
- kali 2.0 linux中的Nmap的操作系统扫描功能
不多说,直接上干货! 可以使用-O选项,让Nmap对目标的操作系统进行识别. msf > nmap -O 202.193.58.13 [*] exec: nmap -O 202.193.58.1 ...
- Windows 10问题
微软修复Windows updat 工具WindowsUpdateDiagnostic.diagcab: http://download.microsoft.com/download/F/2/2/F2 ...
- ReactiveCocoa结合了几种编程风格
函数式编程(Functional Programming):使用高阶函数,例如函数用其他函数作为参数.响应式编程(Reactive Programming):关注于数据流和变化传播.所以,你可能听说过 ...
- UI Framework-1: Aura Views
Views Views is a user interface framework built on a type called, confusingly, View. Responsible for ...
- 了解Linux的基础知识和一般概念
1.GNU和GPL GNU计划(又称革奴计划),是由Richard Stallman(理查德·斯托曼)在1983年9月27日公开发起的自由软件集体协作计划.它的目标是创建一套完全自由的操作系统. ...
- TP5 安装
一.官方手册: https://www.kancloud.cn/manual/thinkphp5/118003 二.Git 方式安装[最新框架下载方式] 首先克隆下载应用项目仓库 git clone ...
- while循环合理运用-判断成绩脚本
在平时的工作生活中,难免不了去写一些交互性质的脚本,然而呢往往有些用户偏偏会输入不合规范的输入,为了避免就此退出脚本重新执行,这时候就可以用while去写一个死循环去针对用户的输出啊.哈哈~他输不对, ...
- sql查询 按照规定的顺序返回结果集。
DECODE函数 oracle 独有,功能强大.相当于 if else if IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ..... ...
- 安装虚拟机(VM)(一)
原创作品,允许转载,转载时请务必声明作者信息和本声明. https://www.cnblogs.com/zhu520/p/10728248.html 本人小白,有错指出.谢谢! 一:安装虚拟机前奏 ...