您的位置:首页 > 其它

Quartz2D之生成圆形头像、打水印、截图三种方法的封装

2015-09-28 22:59 453 查看
我给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(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];

}];

好了,这样就完成了。早日脱离小白!加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: