ios-CGContextDrawImage图形倒置问题

一、简单介绍

首先我们应该知道在UIKit中,y轴是向下的。而在Core Graphics(Quartz) 中 y轴是向上。

所以其实我们使用CGContextDrawImage来绘图的话,默认是在用户空间下绘制出来的,使用的坐标系是以左下角为原点,y轴向上,x轴向右。

二、实战演练

所以我们在进行绘制的时候,写了如下代码

-(void)drawRect:(CGRect)rect
{   
  //获取上下文 
  CGContextRef context = UIGraphicsGetCurrentContext();
    //创建image
    UIImage * image = [UIImage imageNamed:@"05"];
    //指定绘制范围
    CGRect rect1 = CGRectMake(0, 0, 200.0, 200.0);
    绘制到相应的范围当中去
    CGContextDrawImage(context, rect1, image.CGImage); 
}

得到的是这样的图像,也就是说图像是刚好相反的,因为显示在屏幕上面是使用的是设备的坐标,而这样的话正好设备坐标y轴是向下为正的。也就是可以理解成从用户空间转换成了设备空间。


解决方法就是给图形上下文移动坐标系,具体代码如下所示

-(void)drawRect:(CGRect)rect
{
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    UIImage * image = [UIImage imageNamed:@"05"];
    
    CGRect rect1 = CGRectMake(0, 0, 200.0, 200.0);
   
    CGContextTranslateCTM(context, rect1.origin.x, rect.origin.y);
    CGContextTranslateCTM(context, 0, rect1.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextTranslateCTM(context, -rect1.origin.x, -rect1.origin.y);
     CGContextDrawImage(context, rect1, image.CGImage);
}


三、具体分析

那么为什么这样就可以了呢?原因如下。首先先一步步的来解析。

先介绍下用户空间和设备空间的转换,这里为了好画图,也就用箭头来表示图片了。


1、原来的坐标系

2、下面就开始讲坐标的转化,平移

CGContextTranslateCTM(context, rect1.origin.x, rect.origin.y);

3、一样是平移操作CGContextTranslateCTM(context, 0, rect1.size.height);


4、翻转y轴CGContextScaleCTM(context, 1.0, -1.0);

5、再来平移一次CGContextTranslateCTM(context, -rect1.origin.x, -rect1.origin.y);这个时候平移的就是下面那个坐标了,没有平移前这个翻转过的坐标系

平移之后


这样的话我们再转换到设备坐标,得到的还是这样的原始图像了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值