我给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. 【转】RadControls for Silverlight(学习2-RadDataPager)

    引用地址:http://www.cnblogs.com/forrestsun/archive/2011/05/15/2046894.html <Grid x:Name="LayoutR ...

  2. Win7 64位ORACLE取数字乱码的解决

    参见网址http://www.2cto.com/database/201304/201767.html 首先是PLSQL DEVELOPER 直接报错 NLS_LANG 错误 第一步是在命令行下测试 ...

  3. C#3.0 扩展方法

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

  4. hard

    硬盘电路板将信号转化为电压高低,电压控制电脉冲被送到磁头,产生一个电磁.磁盘和磁头很紧密.读写都是不断扫描磁盘的过程.有操作系统负责控制文件的组织,可能在不同的块中.

  5. Hello, RealSense!

    这是kinect for windows: 这是华硕 xtion pro: 这是Intel® RealSense™: 几经周折,终于买到了,99美元套件+25美元运费,正在旅途中.

  6. 2016年Q2《网络安全创新500强》榜单解读

    近日,美国投资咨询机构Cybersecurity Ventures发布了2016 Q2<网络安全创新500强>企业榜单,新兴安全公司root9B异军突起,国内4家企业上榜. 关于Cyber ...

  7. [Python学习笔记1]Python语言基础 数学运算符 字符串 列表

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

  8. 安装ant问题

    1  设置path, 在windwos 7下要重启 2  重启后,cmd----ant -version  Unable to locate tools.jar. Expected to find i ...

  9. UE4 代码编写细节:静态变量

    Note:因为在切换关切时,会GC掉所有GameThread线程下的Object类,如果Static是UOBject 请调用AddToRoot函数  当然如果你的UObject子类Object是在自己 ...

  10. NOIP 考前 高斯消元练习

    POJ 1830 列出n个方程右边为最后的情况 每一行代表第几个灯的情况,每一行代表是否按第几个按钮写出方程即可. #include <cstdio> #include <cstri ...