Quartz2D之生成圆形头像、打水印、截图三种方法的封装
2015-09-28 22:59
453 查看
我给UIImage类添加了一个类目,用于封装三个方法,每个方法都没有难度,做这个主要为了练习一下封装;
首先在类目.h文件中声明三个方法:以及创建了一个枚举、用于水印方法中设定水印位置;方法说明和参数都在下面注释好了
接下来是水印方法的实现
生成头像方法的实现:
3、截图的方法实现:因为考虑到可能会截取到截取按钮的高亮状态,所以方法延迟0.5秒执行;并且使用了block块来传image对象;
block定义为:Typedef void(^XQGBlock)(UIImage *image)
实现效果:
水印:设置水印位于右上角,缩放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];
}];
好了,这样就完成了。早日脱离小白!加油!
首先在类目.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(0, 0, 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(2 * radius, 2 * radius); UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); //取得上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //保存一个初始状态 CGContextSaveGState(ctx); //画裁剪范围 CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, size.width, size.height)); //裁剪 CGContextClip(ctx); //画图片 [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; //设置圆环,设置的为内圆环 //释放初始状态 CGContextRestoreGState(ctx); //radius - border * 2设为圆环半径,头像总半径才能保持为radius,因为设置线段宽度为内外增加相同厚度; CGContextAddArc(ctx, radius, radius, radius - border * 2, 0, M_PI * 2, 0); 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];
}];
好了,这样就完成了。早日脱离小白!加油!
相关文章推荐
- node nodemailer
- 二叉树中和为某一值的路径(剑指offer+二叉树+递归)
- 【C语言】接收字符,大小写字符相互转换后输出,数字不输出
- SSH框架
- hdu 5489 Removed Interval 2015合肥网络赛 树状数组 dp 离散化/dp
- 创业的第四十八天
- Js 图片上传本地预览
- php乱码的解决方法
- 【转】MySQL my.cnf 参数 详解
- CentOS7下安装MySql5.6.26
- Fresco前传(1):一句话搞定图片显示(同时还可以满足各种小需求哦)
- 【第2节】Java数组(1)
- hdu5493Queue 树状数组+二分
- 数据结构之线性表-链式存储之静态链表(二)
- libevent在ubuntu安装方法
- Struts2拦截器
- 4. java中的数据类型
- 【C语言】求两个数的最大公约数
- 应用服务器Tomcat
- Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,