我给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. sqlite学习

    一鼓作气,今天继续学习了sqlite数据库在Xcode上的一些操作,主要是通过用oc代码进行salite表格的创建,删除,修改:以及对现有的表格数据进行增,删,改,查.虽然有点累,但是收获不小,感觉很 ...

  2. Spark的Straggler深入学习(2):思考Block和Partition的划分问题——以论文为参考

    一.partition的划分问题 如何划分partition对block数据的收集有很大影响.如果需要根据block来加速task的执行,partition应该满足什么条件? 参考思路1:range ...

  3. UIProgressView改变高度

    CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f); progressView.transform = trans ...

  4. j2ee学习资料收集

    1    tomcat web.xml加载顺序,  讲解了web.xml什么时候加载,内部的各个组件加载的顺序 http://blog.sina.com.cn/s/blog_4553489c01010 ...

  5. css z-index

    使用z-index的position必须是relative或者是absolute

  6. [转]程序员自己写的神器 MonoDevelop 4 (Xamarin Studio) Debugging for Unity

    原文地址 http://www.cliffordroche.ca/monodevelop-4-xamarin-studio-debugging-in-unity/ MonoDevelop 4 (Xam ...

  7. LeetCode 094 Binary Tree Inorder Traversal

    方法一:(递归) class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int ...

  8. Linux上安装oracle客户端及sqlldr

    1.建立oracle的安装目录,一般为/opt/oracle:2.将安装包instantclient-basic-linux.x64-11.2.0.3.0.zip放入到该目录中,并进行解压:unzip ...

  9. HDU 5015

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 矩阵是表示状态转移的利器 这题m很大,n非常小,所以开始的思考角度是能否从当前列推出下一列.有了这个角度, ...

  10. LaTex表格内单元格内容强制换行

    /newcommand{/tabincell}[2]{/begin{tabular}{@{}#1@{}}#2/end{tabular}}%放在导言区 %然后使用&/tabincell{c}{} ...