Quartz2D-03.利用Quartz2D画复杂事物

1.利用Quartz2D画文字

- (void)drawRect:(CGRect)rect
    // 1.获得图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2.画文字
    /*
     withAttributes:文字的字体颜色大小等信息(字典)
     */

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    // 定义文字颜色
    dict[NSForegroundColorAttributeName] = [UIColor redColor];
    // 定义文字字体大小
    dict[NSFontAttributeName] = [UIFont systemFontOfSize:18];

    NSString *str = @"我是哈哈 strong good morning";
    //    [str drawAtPoint:CGPointZero withAttributes:nil];
    [str drawInRect:CGRectMake(50, 50, 100, 100) withAttributes:dict];

    // 3.显示到View上
    CGContextStrokePath(ctx);//空心路径渲染
    //  CGContextFillPath(ctx);//实心路径渲染
}

2.利用Quartz2D画图片

  • 画图片

- (void)drawRect:(CGRect)rect {
    // 1.获得图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2.画图片
    UIImage *img = [UIImage imageNamed:@"img1"];
//    [img drawAtPoint:CGPointZero];
//    [img drawInRect:CGRectMake(50, 50, 100, 100)];// 图片会拉伸

    [img drawAsPatternInRect:self.bounds];//平铺到整个视图

    // 添加文字水印
    NSString *str = @"糖伯虎著";

    [str drawAtPoint:CGPointMake(10, 200) withAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]}];

    // 3.显示到View上
    CGContextStrokePath(ctx);//空心路径渲染
//  CGContextFillPath(ctx);//实心路径渲染

}

3.利用Quartz2D制作水印

  • 图片水印
- (void)viewDidLoad {
    [super viewDidLoad];

    UIImage *bgImage = [UIImage imageNamed:@"scene"];

    // 1.创建一个基于位图的上下文(开启一个基于位图的上下文)
    /**
     >size: 新图片的尺寸
     >opaque: 不透明度 YES 代表不透明,NO 代表透明
     >scale:拉伸尺寸
     */
    UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0);

    // 2.画背景
    [bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];

    // 3.画水印
    UIImage *waterImage = [UIImage imageNamed:@"logo"];
    // 计算位置
    CGFloat margin = 5;
    CGFloat scale = 0.2;
    CGFloat waterImageW = waterImage.size.width * scale;
    CGFloat waterImageH = waterImage.size.height * scale;
    CGFloat waterImageX = bgImage.size.width - waterImageW - margin;
    CGFloat waterImageY = bgImage.size.height - waterImageH - margin;
    [waterImage drawInRect:CGRectMake(waterImageX, waterImageY, waterImageW, waterImageH)];

    // 4.从上下文取得画完的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    // 5.结束上下文
    UIGraphicsEndImageContext();

    // 6.显示图片
    self.iv.image = newImage;

    // 7.将图片压缩为PNG格式
     NSData *data = UIImagePNGRepresentation(newImage);

    // 8.保存到应用文件中
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    [data writeToFile:path atomically:YES];
}

4.利用Quartz2D进行图片裁剪

  • 裁剪圆形图片
- (void)viewDidLoad {
    [super viewDidLoad];
    // 0.加载原图
    UIImage *me = [UIImage imageNamed:@"me"];
    // 1.开启图片上下文
    UIGraphicsBeginImageContextWithOptions(me.size, NO, 0.0);
    // 2.获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 3.画圆
//    CGContextAddArc(ctx, 0, 0, me.size.width * 0.5, 0, M_PI * 2, 0);
    CGRect rect = CGRectMake(0, 0, me.size.width, me.size.height);
    CGContextAddEllipseInRect(ctx, rect);
    // 4.裁剪
    CGContextClip(ctx);
    // 5.画图片
    [me drawInRect:rect];
    // 6.取出新图
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // 7.结束图片上下文
    UIGraphicsEndImageContext();
    // 8.写入文件
    NSData *data = UIImagePNGRepresentation(newImage);
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    [data writeToFile:path atomically:YES];
    // 9.显示新图
    self.iv.image = newImage;
}
  • 裁剪带圆形边框的图片
- (void)viewDidLoad {
    [super viewDidLoad];

    // 0.加载原图
    UIImage *me = [UIImage imageNamed:@"me"];
    // 1.开启图片上下文
    CGFloat borderW = 2;
    CGFloat imageW = me.size.width + borderW * 2;
    CGFloat imageH = me.size.height + borderW * 2;
    CGSize newSize = CGSizeMake(imageW, imageH);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

    // 2.获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 3.画大圆
    CGContextAddArc(ctx, me.size.width * 0.5 + borderW , me.size.width * 0.5 + borderW, me.size.width * 0.5 + borderW, 0, M_PI * 2, 0);
    // 3.1设置填充色为白色
    CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);
    // 3.2填充大圆
    CGContextFillPath(ctx);

    // 4.画小圆
    CGRect rect = CGRectMake(borderW, borderW, me.size.width, me.size.height);
    CGContextAddEllipseInRect(ctx, rect);
    // 5.裁剪
    CGContextClip(ctx);
    // 6.画图
    [me drawInRect:rect];
    // 7.取出新图
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // 8.结束图片上下文
    UIGraphicsEndImageContext();
    // 9.显示新图
    self.iv.image = newImage;
    // 10.写入文件
    // 10.1将图片压缩为PNG格式
    NSData *data = UIImagePNGRepresentation(newImage);
    // 10.2获取document全路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 10.3写入文件
    [data writeToFile:path atomically:YES];

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值