我给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之生成圆形头像、打水印、截图三种方法的封装的更多相关文章

  1. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  2. javascript生成对象的三种方法

    /** js生成对象的三种方法*/ // 1.通过new Object,然后添加属性 示例如下: var people1 = new Object(); people1.name = 'xiaohai ...

  3. php生成随机数的三种方法

    php生成随机数的三种方法 如何用php生成1-10之间的不重复随机数? 例1,使用shuffle函数生成随机数. <?php$arr=range(1,10);shuffle($arr);for ...

  4. JqueryMobile动态生成listView并实现刷新的两种方法

    本篇文章主要是对JqueryMobile动态生成listView并实现刷新的两种方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JqueryMobile动态生成listView并实现刷新 ...

  5. javascript生成新标签的三种方法

    javascript生成新标签的三种方法:http://www.cnblogs.com/online-link/p/6062423.html

  6. iOS实现头像选取(照相或者图片库)、大小等比缩放、生成圆形头像

    //弹出actionsheet.选择获取头像的方式 //从相册获取图片 -(void)takePictureClick:(UIButton *)sender { // /*注:使用,需要实现以下协议: ...

  7. iOS常见用户头像的圆形图片裁剪常见的几种方法

    在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...

  8. 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)

    如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...

  9. jq给动态生成的标签绑定事件的几种方法

    经常遇到给动态生成的标签绑定事件不好用,自己简单测试总结了下,结论如下了: body> <!-- 下面是用纯动态方式生成标签 --> <div id="d2" ...

随机推荐

  1. 一个比较综合的项目--》>图片缓存,下拉刷新等

    在办公室电脑(E:\workspace\23\Collections)

  2. Longest Substring Without Repeating Characters(Difficulty: Medium)

    题目: Given a string, find the length of the longest substring without repeating characters. Examples: ...

  3. Scrum领取任务

    这次主要讨论了产品的构造流程,怎么将任务分配到个人,讨论什么功能具体怎么实现,然后各自选取了任务. 在团队项目“广商百货”的SCRUM项目中我认领的任务是对登录功能的实现.现在还没正式开始,还在看书和 ...

  4. matlab初学之strcat、num2str

    文章出处: http://blog.sina.com.cn/s/blog_6fb8aa0d01019id5.html http://wenda.so.com/q/1439143662729624 ht ...

  5. jquery打印特定div

    实现javascript打印功能,打印整个页面就很简单,但如果指定打印某一个区域就有点难点,这里有一个jQuery插件PrintArea可实现打印页面某区域功能. 使用说明需要使用jQuery库文件和 ...

  6. fzu2028

    //Accepted 7324 KB 203 ms /* source:fzu2028 time :2015.5.29 by :songt */ /*题解: 树链剖分 单点更新,求路径和 */ #in ...

  7. php生成html文件的多种方法介绍

    我经常会在网上看到有人问怎么将整个动态的网站静态化,其实实现的方法很简单.  代码如下 复制代码 <?php//在你的开始处加入 ob_start(); ob_start(); //以下是你的代 ...

  8. WebDriver 常见Exception处理

    1. org.openqa.selenium.WebDriverException: unknown error: unhandled inspector error: {"code&quo ...

  9. SQL Server 简介

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.是以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度的特点.是与应用程序彼此独立的数据集合. SQL S ...

  10. navicat在ubuntu下中文乱码的真正解决方法ZT

    乱码解决方法(自己解决我自己这种情况之后打猜测): 打开start_navicat文件,会看到 export LANG="en_US.UTF-8" 将这句话改为 export LA ...