Quartz2D之生成圆形头像、打水印、截图三种方法的封装
我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装;
首先在类目.h文件中声明三个方法:以及创建了一个枚举、用于水印方法中设定水印位置;方法说明和参数都在下面注释好了
typedef enum:NSUInteger{
XQGConrnerTopLeftType,//左上角
XQGConrnerTopRightType,//右上角
XQGConrnerBottomLeftType,//左下角
XQGConrnerBottomRightType,//右下角
} XQGConrnerType;
@interface UIImage (XQGQuartz2D)
/**
* 得到一张带水印的图片
*
* @param waterIMG 水印图片
* @param bacIMG 背景图片
* @param size 水印距离某个角的边距
* @param XQGConrnerType 水印靠近背景哪个角上
* @param scale 缩放比例,不缩放为1
*
* @return UIImage
*/
+ (instancetype)getWatermarkImageWithWaterImage:(UIImage *)waterIMG
andImage:(UIImage *)bacIMG
andDistance:(CGSize)size
andWhichCorner:(XQGConrnerType)XQGConrnerType
andScale:(CGFloat)scale;
/**
* 得到一张带边框的圆角头像
*
* @param image 制作头像的图片
* @param radius 头像半径
* @param border 边框厚度,0为没有
* @param color 边框颜色
*
* @return UIImage
*/
+ (instancetype)getCircleIconWithImage:(UIImage *)image
andRadius:(CGFloat)radius
andBorder:(CGFloat)border
andColor:(UIColor *)color;
/**
* 截图
*
* @param view 需要被截图的view
*
* @return UIImage
*/
49 + (void)ScreenshotsWithView:(UIView *)view andImage:(XQGBlock)image
接下来是水印方法的实现
//开启上下文:基于位图(bitmap),所有的东西需要绘制到一张新的图片上去
//size:新图片的尺寸
//opaque:yes:不透明,no:透明
//scale:伸缩尺寸;
UIGraphicsBeginImageContextWithOptions(bacIMG.size, NO, 0.0);
//画背景,背景大小即背景图片尺寸
[bacIMG drawInRect:CGRectMake(, , bacIMG.size.width, bacIMG.size.height)];
//画水印,scale为1时水印大小等于原水印图片大小;
CGFloat waterX;
CGFloat waterY;
CGFloat waterW = waterIMG.size.width * scale;
CGFloat waterH = waterIMG.size.height * scale;
//根据位置参数设定水印位于哪个角落,以及边距
switch (XQGConrnerType)
case XQGConrnerBottomLeftType:
waterX = size.width;
waterY = bacIMG.size.height - size.height - waterIMG.size.height;
break;
case XQGConrnerTopLeftType:
waterX = size.width;
waterY = size.height;
break;
case XQGConrnerBottomRightType:
waterX = bacIMG.size.width - size.width - waterIMG.size.width;
waterY = bacIMG.size.height - size.height - waterIMG.size.height;
break;
case XQGConrnerTopRightType:
waterX = bacIMG.size.width - size.width - waterIMG.size.width;
waterY = size.height;
break; default:
break;
}
//把水印保存到上下文中
[waterIMG drawInRect:CGRectMake(waterX , waterY, waterW, waterH)];
//从上下文中取得制作完毕的UIImage对象
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
return newImage;
生成头像方法的实现:
+ (instancetype)getCircleIconWithImage:(UIImage *)image andRadius:(CGFloat)radius andBorder:(CGFloat)border andColor:(UIColor *)color
{
CGSize size = CGSizeMake( * radius, * radius);
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); //取得上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//保存一个初始状态
CGContextSaveGState(ctx);
//画裁剪范围
CGContextAddEllipseInRect(ctx, CGRectMake(, , size.width, size.height));
//裁剪
CGContextClip(ctx);
//画图片
[image drawInRect:CGRectMake(, , size.width, size.height)];
//设置圆环,设置的为内圆环
//释放初始状态
CGContextRestoreGState(ctx);
//radius - border * 2设为圆环半径,头像总半径才能保持为radius,因为设置线段宽度为内外增加相同厚度;
CGContextAddArc(ctx, radius, radius, radius - border * , , M_PI * , );
CGContextSetLineWidth(ctx, border);
[color setStroke];
CGContextStrokePath(ctx);
//从上下文中取得制作完毕的UIImage对象
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext(); return newImage;
}
3、截图的方法实现:因为考虑到可能会截取到截取按钮的高亮状态,所以方法延迟0.5秒执行;并且使用了block块来传image对象;
block定义为:Typedef void(^XQGBlock)(UIImage *image)
+(void)ScreenshotsWithView:(UIView *)view andImage:(XQGBlock)image
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//1、开启上下文
UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0.0);
//2、将控制器view的layer渲染到上下文,想要截啥就把哪个图层拿出来渲染
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
//3、取出图片
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
image(newImage);
});
}
实现效果:
水印:设置水印位于右上角,缩放0.8,距离上右边界为10;
水印图片;
[UIImage getWatermarkImageWithWaterImage:water andImage:bacimage andDistance:CGSizeMake(10, 10) andWhichCorner:XQGConrnerTopRightType andScale:0.8];
输出结果;
头像:设置头像半径为40,描边厚度为2、黑色
[UIImage getCircleIconWithImage:icon andRadius:40 andBorder:2 andColor:[UIColor blackColor]];

截图:把需要截图的view带进去即可;在block回调中获取图片进行操作即可,我的为保存到桌面;就不放图了;
[UIImage ScreenshotsWithView:self.viewIMG andImage:^(UIImage *image) {
NSData * data = UIImagePNGRepresentation(image);
[data writeToFile:@"/Users/ibokan/Desktop/icon.png" atomically:YES];
}];
好了,这样就完成了。早日脱离小白!加油!
Quartz2D之生成圆形头像、打水印、截图三种方法的封装的更多相关文章
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
- javascript生成对象的三种方法
/** js生成对象的三种方法*/ // 1.通过new Object,然后添加属性 示例如下: var people1 = new Object(); people1.name = 'xiaohai ...
- php生成随机数的三种方法
php生成随机数的三种方法 如何用php生成1-10之间的不重复随机数? 例1,使用shuffle函数生成随机数. <?php$arr=range(1,10);shuffle($arr);for ...
- JqueryMobile动态生成listView并实现刷新的两种方法
本篇文章主要是对JqueryMobile动态生成listView并实现刷新的两种方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JqueryMobile动态生成listView并实现刷新 ...
- javascript生成新标签的三种方法
javascript生成新标签的三种方法:http://www.cnblogs.com/online-link/p/6062423.html
- iOS实现头像选取(照相或者图片库)、大小等比缩放、生成圆形头像
//弹出actionsheet.选择获取头像的方式 //从相册获取图片 -(void)takePictureClick:(UIButton *)sender { // /*注:使用,需要实现以下协议: ...
- iOS常见用户头像的圆形图片裁剪常见的几种方法
在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...
- 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)
如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...
- jq给动态生成的标签绑定事件的几种方法
经常遇到给动态生成的标签绑定事件不好用,自己简单测试总结了下,结论如下了: body> <!-- 下面是用纯动态方式生成标签 --> <div id="d2" ...
随机推荐
- MVC教程相关
本教程所有文章导航 本系列共10篇文章,翻译自Asp.Net MVC4 官方教程,由于本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,非常适合新手入门Asp.Ne ...
- Python开发入门与实战15-IIS部署
15. IIS部署 前面的章节我们完成了基本的业务功能的开发,本章节我们来说说python django项目如何部署到实际的运行环境,完成开发系统的发布工作. Python Django 项目部署发布 ...
- 一定要在主线程更新UI
在一些技术交流群里面,一些初学者(我表示我也是其中一人),总是会发现,为什么我UIView的animate方法,不会动!而是直接闪? 这是为什么呢? 一定要在主线程中更新UI! 一定要在主线程中更新U ...
- Hadoop基本操作
命令基本格式: hadoop fs -cmd < args > 1.ls hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件 hadoop fs -ls -R / 列 ...
- Axis2测试webservice server以及client
一.环境搭建 下载axis2-1.6.2-war.zip/axis2-1.6.2-bin.zip等. 参考axis2-1.6.2-war\README.txt以及axis2-1.6.2-war\axi ...
- 微软How old do I Look——初体验
前段时间微软发布了一个可爱的网站how old.net,着实火了一把,全民体验魔镜魅力. 上传自己的靓照到http://www.how-old.net/,它就可以告诉你性别和年龄,大家还习惯称之为“颜 ...
- ORACLE存储过程学习
存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...
- HDU 5441 离线处理 + 并查集
题意:给n个节点m条带权值边的无向图.然后q个问题,每次询问点对的数目,点对需要满足的条件是:1)连通:2)其路径的最大权值不能超过询问值. 分析:如果没次询问一次,dfs一次,很可能超时,因此可以用 ...
- python 字符串内建函数
方法 描述 string.capitalize() 把字符串的第一个字符大写 string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 string ...
- 第三个Sprint冲刺第十天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:做最后的工作