关于Quartz2D方法小总结

时间:2023-02-08 15:56:43
 
 
// 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];
}