// oc 奇偶填充 - (void)test11 { UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 200, 100)]; [path addArcWithCenter:CGPointMake(200, 150) radius:80 startAngle:0 endAngle:2 * M_PI clockwise:YES]; path.usesEvenOddFillRule = YES; [path fill]; } // c 奇偶填充 - (void)test10 { // 1. 获取"图形上下文" CGContextRef ctx = UIGraphicsGetCurrentContext(); UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 200, 100)]; UIBezierPath* path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 150) radius:80 startAngle:0 endAngle:M_PI * 2 clockwise:1]; UIBezierPath* path2 = [UIBezierPath bezierPathWithRect:CGRectMake(250, 30, 20, 200)]; CGContextAddPath(ctx, path2.CGPath); CGContextAddPath(ctx, path1.CGPath); CGContextAddPath(ctx, path.CGPath); // 说明: 被覆盖过奇数次的点填充, 被覆盖过偶数次的点不填充 // 奇填偶不填 CGContextDrawPath(ctx, kCGPathEOFill); } // c 渲染方式 - (void)test9 { // 设置渲染方式 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextMoveToPoint(ctx, 50, 50); CGContextAddLineToPoint(ctx, 100, 100); CGContextAddLineToPoint(ctx, 150, 50); CGContextClosePath(ctx); // 渲染 // CGContextStrokePath(ctx); // 描边 // CGContextFillPath(ctx); // 填充 [[UIColor redColor] setFill]; [[UIColor blueColor] setStroke]; CGContextDrawPath(ctx, kCGPathFillStroke); } // oc 渲染方式 - (void)test8 { // 路径 UIBezierPath* path = [UIBezierPath bezierPath]; // 添加路径 [path moveToPoint:CGPointMake(50, 50)]; [path addLineToPoint:CGPointMake(100, 100)]; [path addLineToPoint:CGPointMake(150, 50)]; // [path addLineToPoint:CGPointMake(30, 30)]; // 关闭路径 [path closePath]; [[UIColor redColor] setFill]; [[UIColor blueColor] setStroke]; // 渲染 [path fill]; //填充 [path stroke]; // 描边儿 } // oc版本 设置样式 - (void)test7 { CGContextRef ctx = UIGraphicsGetCurrentContext(); UIBezierPath* path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(50, 50)]; [path addLineToPoint:CGPointMake(100, 100)]; [path addLineToPoint:CGPointMake(150, 50)]; // 设置线宽 [path setLineWidth:10]; // 设置头尾相接处的样式 [path setLineJoinStyle:kCGLineJoinRound]; // 设置头尾的样式 [path setLineCapStyle:kCGLineCapRound]; // 设置颜色 [[UIColor redColor] setStroke]; // [path stroke]; CGContextAddPath(ctx, path.CGPath); CGContextStrokePath(ctx); } // c版本 设置样式 - (void)test6 { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextMoveToPoint(ctx, 50, 50); CGContextAddLineToPoint(ctx, 100, 100); CGContextAddLineToPoint(ctx, 150, 50); // 设置样式要在渲染之前 CGContextSetLineWidth(ctx, 30); // 设置头尾相接的样式 // kCGLineJoinMiter 默认 // kCGLineJoinRound 圆角 // kCGLineJoinBevel 切角 CGContextSetLineJoin(ctx, kCGLineJoinBevel); // 设置头尾的样式 // kCGLineCapRound 圆角 // kCGLineCapButt 按照画得点来进行设置头尾 // kCGLineCapSquare 按照画的点 + 宽度的一半 CGContextSetLineCap(ctx, kCGLineCapButt); // 设置颜色 [[UIColor redColor] setStroke]; // 渲染 CGContextStrokePath(ctx); } // 画圆环 - (void)test5 { // 圆环 // // 获取图形上下文 // CGContextRef ctx = UIGraphicsGetCurrentContext(); // // 拼接路径 // CGContextAddArc(ctx, 150, 150, 100, 0, 2 * M_PI, 1); // // // 设置线宽 // CGContextSetLineWidth(ctx, 10); // // // 渲染 // CGContextStrokePath(ctx); UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:2 * M_PI clockwise:1]; [path setLineWidth:20]; [path stroke]; } // 画圆 - (void)test4 { // 1.根据画椭圆的方法 来实现 (宽高相等) // UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 150, 150)]; // // [path stroke]; // 2.画弧 // UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:M_PI_4 endAngle:M_PI_2 clockwise:YES]; // // [path stroke]; CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddArc(ctx, 150, 150, 100, M_PI_4, M_PI_2, 1); CGContextStrokePath(ctx); } // 椭圆 - (void)test3 { // UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 200)]; // // [path stroke]; // 获取图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 画椭圆 CGContextAddEllipseInRect(ctx, CGRectMake(50, 50, 200, 100)); // 渲染 CGContextStrokePath(ctx); } // 圆角矩形(也可以画圆) - (void)test2 { // cornerRadius 圆角半径 如果你参数比这个正常要大 直接就是圆 UIBezierPath* path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(100, 100, 100, 100) cornerRadius:50]; [path stroke]; } // 矩形 - (void)test1 { UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 100, 200)]; [path stroke]; }
//给图片打水印代码 UIImage *bgImage = [UIImage imageNamed:@"图片名称"]; // 上下文 : 基于位图(bitmap) , 所有的东西需要绘制到一张新的图片上去 // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) // size : 新图片的尺寸 // opaque : YES : 不透明, NO : 透明 // 这行代码过后.就相当于常见一张新的bitmap,也就是新的UIImage对象 UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0); // 2.画背景 [bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)]; // 3.画右下角的水印 UIImage *waterImage = [UIImage imageNamed:@"水印名称"]; CGFloat scale = 0.2; CGFloat margin = 5; CGFloat waterW = waterImage.size.width * scale; CGFloat waterH = waterImage.size.height * scale; CGFloat waterX = bgImage.size.width - waterW - margin; CGFloat waterY = bgImage.size.height - waterH - margin; [waterImage drawInRect:CGRectMake(waterX, waterY, waterW, waterH)]; // 4.从上下文中取得制作完毕的UIImage对象 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // 5.结束上下文 UIGraphicsEndImageContext(); // 6.显示到UIImageView self.iconView.image = newImage; // 7.将image对象压缩为PNG格式的二进制数据 NSData *data = UIImagePNGRepresentation(newImage); // UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>) // 8.写入文件 NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"new.png"]; [data writeToFile:path atomically:YES];
以下是关于Quartz2D的一些方法的小总结,希望能帮的上你,直接上代码,代码中已经清标注了注释:
//裁剪图片 - (void)Clip{ CGContextRef ctx = UIGraphicsGetCurrentContext(); // 0.画圆 CGContextAddEllipseInRect(ctx, CGRectMake(100, 100, 50, 50)); // 裁剪 CGContextClip(ctx); CGContextFillPath(ctx); // 1.显示图片 UIImage *image = [UIImage imageNamed:@"me"]; [image drawAtPoint:CGPointMake(100, 100)]; } //图形上下文栈 - (void)zhan{ // 1.获得上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 将ctx拷贝一份放到栈中 CGContextSaveGState(ctx); // 设置绘图状态 CGContextSetLineWidth(ctx, 10); [[UIColor redColor] set]; CGContextSetLineCap(ctx, kCGLineCapRound); // 第1根线 CGContextMoveToPoint(ctx, 50, 50); CGContextAddLineToPoint(ctx, 120, 190); CGContextStrokePath(ctx); // 将栈顶的上下文出栈,替换当前的上下文 CGContextRestoreGState(ctx); // 第2根线 CGContextMoveToPoint(ctx, 10, 70); CGContextAddLineToPoint(ctx, 220, 290); CGContextStrokePath(ctx); // CGContextDrawPath(ctx, kCGPathStroke); } //画图片 - (void)img{ //得到图片 UIImage *img = [UIImage imageNamed:@"图片名称"]; //绘制图片 //1.以这个点为图片左上角的点 //[img drawAtPoint:CGPointMake(20, 20)]; //2.以这个范围拉伸图片 //[img drawInRect:CGRectMake(0, 0, 50, 50)]; //3.在这个范围内平铺图片(图片自己尺寸不变) [img drawAsPatternInRect:CGRectMake(0, 0, 100, 100)]; } //画文字 - (void)word{ //绘制文字(不用开启图形上下文) NSString *str = @"kwf哈wgkwg哈"; CGRect wordRect = CGRectMake(20, 20, 100, 50); //给要显示的文字设置一个范围 //NSForegroundColorAttributeName:文字颜色 //NSFontAttributeName : 字体 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; //设置字体颜色 dict[NSForegroundColorAttributeName] = [UIColor greenColor]; //设置字体大小 dict[NSFontAttributeName] = [UIFont systemFontOfSize:20]; [str drawInRect:wordRect withAttributes:dict]; } //画弧 void huxing(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //画弧 /** * 20:圆心X值 * 20:圆心Y值 * 30:半径 * 0:起始角度 * M_PI_2:结束角度 * 0:顺时针方向 1:逆时针方向 */ CGContextAddArc(ctx, 20, 20, 30, 0, M_PI_2, 0); //设置线条宽度 CGContextSetLineWidth(ctx, 5); //渲染并显示到view上(实心) CGContextStrokePath(ctx); } //画圆 void yuan(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //画圆 CGContextAddEllipseInRect(ctx, CGRectMake(20, 20, 50, 50)); //设置线条宽度 CGContextSetLineWidth(ctx, 5); //渲染并显示到view上(实心) CGContextStrokePath(ctx); } //实心矩形 void juxings(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //画矩形 CGContextAddRect(ctx, CGRectMake(10, 10, 90, 90)); //渲染并显示到view上(实心) CGContextFillPath(ctx); } //空心矩形 void juxingk(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //画矩形 CGContextAddRect(ctx, CGRectMake(10, 10, 90, 90)); //设置线条宽度 CGContextSetLineWidth(ctx, 10); //设置线条颜色(空心:也就是设置线条颜色) CGContextSetRGBStrokeColor(ctx, 1, 0, 0, 1); //设置图形颜色(实心:也就是填充色) CGContextSetRGBFillColor(ctx, 1, 0, 0, 1); //设置空心,实心通用的方法 [[UIColor blueColor]set]; //设置线段头尾部样式 CGContextSetLineCap(ctx, kCGLineCapRound); //设置线段转折点样式 CGContextSetLineJoin(ctx, kCGLineJoinRound); //渲染并显示到view上 CGContextStrokePath(ctx); } //空心三角形 void sanjiaoxing(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //设置一个起点 CGContextMoveToPoint(ctx, 10, 10); //添加一条线的另一个点 CGContextAddLineToPoint(ctx, 50, 50); //再添加一个点 CGContextAddLineToPoint(ctx, 10, 50); //关闭路径 CGContextClosePath(ctx); //渲染并显示到view上 CGContextStrokePath(ctx); } //一条线 void xian(){ //开启一个图形上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); //设置一个起点 CGContextMoveToPoint(ctx, 10, 10); //设置一个 CGContextAddLineToPoint(ctx, 50, 50); //渲染并显示到view上 CGContextStrokePath(ctx); }
//重绘(也就是会调用setNeedsDisplay这个方法)
[self setNeedsDisplay];
//截取整个屏幕的画面(截屏) + (instancetype)captureWithView:(UIView *)view { // 1.开启上下文 UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0); // 2.将控制器view的layer渲染到上下文 [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // 3.取出图片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // 4.结束上下文 UIGraphicsEndImageContext(); return newImage; }
//给view设置自定义的背影 - (void)viewDidLoad { [super viewDidLoad]; // self.view.backgroundColor = [UIColor redColor]; // 1.创建一行背景图片 CGFloat rowW = self.view.frame.size.width; // CGFloat rowH = 40; CGFloat rowH = 30; UIGraphicsBeginImageContextWithOptions(CGSizeMake(rowW, rowH), NO, 0.0); CGContextRef ctx = UIGraphicsGetCurrentContext(); // 画矩形框 [[UIColor redColor] set]; CGContextAddRect(ctx, CGRectMake(0, 0, rowW, rowH)); CGContextFillPath(ctx); // 2.画线 [[UIColor greenColor] set]; CGFloat lineWidth = 2; CGContextSetLineWidth(ctx, lineWidth); CGFloat dividerX = 0; CGFloat dividerY = rowH - lineWidth; CGContextMoveToPoint(ctx, dividerX, dividerY); CGContextAddLineToPoint(ctx, rowW - dividerX, dividerY); CGContextStrokePath(ctx); // 3.取图 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // 4.结束上下文 UIGraphicsEndImageContext(); // 5.设置为背景 self.textView.backgroundColor = [UIColor colorWithPatternImage:newImage]; }