关于Quartz2D方法小总结


// 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];
}

 

posted on 2015-10-12 21:24  ZMIOS  阅读(689)  评论(0编辑  收藏  举报