iOS: 使用CGContextRef中的Transform来辅助作图

注意:

本文讲述CGContextRef中相关Transform使用的API,其他类型的Transform会和此类似。

对于CGPath,Path的添加函数中会有CGAfflineTransform参数。如下图:

image

对于UIBezierPath类型,请使用applyTransform方法。

使用Transform可以帮助我们画出一些有规律且复杂的图像,同时Transform还可以使代码可重复利用性更高,因为我们不需要关注每一个元素的原始坐标,只需要进行Transform,然后执行绘画逻辑就可以。

首先我们会完成这样一个图:

wps_clip_image-22751

 

显然这个图可以看做是一个矩形通过不停地旋转而得来的,所以过程就是绘制一个矩形,然后使用CGContextRotateCTM做旋转Transform,接着继续上面的步骤,直到画完为止。

代码如下(在ViewController内):

- (void)viewWillAppear:(BOOL)animated
{
    //开始绘画
    UIGraphicsBeginImageContext(self.view.bounds.size);
    CGContextRef gc = UIGraphicsGetCurrentContext();
    
    //设置颜色
    [[UIColor grayColor] setFill];
    
    //设置中心点
    CGFloat cenx = CGRectGetMidX(self.view.bounds);
    CGFloat ceny = CGRectGetMidY(self.view.bounds);
    CGContextTranslateCTM(gc, cenx, ceny);
    
    //不断绘图并设置旋转
    for(int i = 0; i < 12; i++)
    {
        CGContextAddRect(gc, CGRectMake(-5, 0, 10, 100));
        CGContextFillPath(gc);
        CGContextRotateCTM(gc, 30 * M_PI/180);
    }
    
    //结束绘画
    UIImage *destImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //创建UIImageView并显示在界面上
    UIImageView *imgView = [[UIImageView alloc] initWithImage:destImg];
    [self.view addSubview:imgView];
}

 

旋转Transform一旦执行坐标就是固定的,所以我们可以随意调节矩形的位置,比如把上面的CGContextAddRect函数调用改成下面这个样子(减少高度,并增加Y轴距离):

CGContextAddRect(gc, CGRectMake(-5, 50, 10, 50));

执行后是这样的:

wps_clip_image-24789

 

Transform的效果是可以叠加的,通过不断叠加改变Transform来完成我们的需求,而真正的绘图逻辑则会变得非常简单,实际上我们只需要命令它会画某某某,而某某某具体的位置会被相应的Transform所决定。比如画一个这样的图形,如下图:

wps_clip_image-24981

 

完整代码(在ViewController内):

- (void)viewWillAppear:(BOOL)animated
{
    //开始绘画
    UIGraphicsBeginImageContext(self.view.bounds.size);
    CGContextRef gc = UIGraphicsGetCurrentContext();
    
    //设置颜色
    [[UIColor blueColor] setFill];
    
    //绘画
    CGRect rect = CGRectMake(-5, 0, 10, -50);
    CGContextTranslateCTM(gc, 0, 60);
    [self goStraight:gc rect:rect offset:20];
    [self turnDirection:gc rect:rect angle:30 count:3];
    [self goStraight:gc rect:rect offset:20];
    //把旋转点从一个方向移到另外一个方向,注意需要用CGContextScaleCTMY轴颠倒
    CGContextTranslateCTM(gc, 0, -50);
    CGContextScaleCTM(gc, 1, -1);
    [self turnDirection:gc rect:rect angle:30 count:3];
    [self goStraight:gc rect:rect offset:20];
    
    //结束绘画
    UIImage *destImg = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //创建UIImageView并显示在界面上
    UIImageView *imgView = [[UIImageView alloc] initWithImage:destImg];
    [self.view addSubview:imgView];
}

//使用CGContextTranslateCTM并连续画5个方格
- (void)goStraight:(CGContextRef)gc rect:(CGRect)rect offset:(CGFloat)offset
{
    for(int i = 0; i < 5; i++)
    {
        CGContextTranslateCTM(gc, offset, 0);
        CGContextFillRect(gc, rect);
    }
}

//使用CGContextRotateCTM旋转并画指定个数的方格
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果不想使用CoreImage框架,也可以使用ZBarSDK来获取图片二维码的定位。 1. 导入ZBarSDK: 在项目导入ZBarSDK,并在需要使用的文件引入头文件: ``` #import "ZBarSDK.h" ``` 2. 加载图片: ``` UIImage *image = [UIImage imageNamed:@"image.png"]; CGImageRef imageRef = image.CGImage; ``` 3. 创建ZBarImageScanner并设置识别类型: ``` ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init]; [scanner setSymbology: ZBAR_QRCODE config: ZBAR_CFG_ENABLE to: 1]; ``` 4. 将图片转换为ZBarImage对象: ``` ZBarImage *zbarImage = [[ZBarImage alloc] initWithCGImage:imageRef]; ``` 5. 扫描二维码: ``` [scanner scanImage:zbarImage]; ``` 6. 遍历扫描结果,获取二维码定位: ``` for (ZBarSymbol *symbol in scanner.results) { NSArray *corners = symbol.bounds; // 获取定位四个角的坐标 // 在图像上绘制定位 UIGraphicsBeginImageContext(imageSize); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextSetLineWidth(context, 2.0); CGContextMoveToPoint(context, corners[0].x, corners[0].y); CGContextAddLineToPoint(context, corners[1].x, corners[1].y); CGContextAddLineToPoint(context, corners[2].x, corners[2].y); CGContextAddLineToPoint(context, corners[3].x, corners[3].y); CGContextAddLineToPoint(context, corners[0].x, corners[0].y); CGContextStrokePath(context); UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } ``` 这样就可以在原图上绘制出二维码的定位了。需要注意的是,ZBarSDK是第三方框架,需要先在官网注册并获取授权才能使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值