在新建集成UIView的自定義的view中咱圆,- (void)drawRect:(CGRect)rect;方法中通過UIGraphicsGetCurrentContext()即可得到當(dāng)前上下文
-
在congtroller中是不能直接用這種方法獲取上下文的,因?yàn)閏ongtroller中是沒有上下文的姥闪,需要自己手動(dòng)開啟
關(guān)于坐標(biāo)系:
1名船,UIKit坐標(biāo)系原點(diǎn)是位于屏幕左上角
2寓免,Quart 2D坐標(biāo)系原點(diǎn)位于屏幕左下角,QuartzCore是基于Quart 2D拯腮,所以其坐標(biāo)系也是位于左下角墓拜,不同于UIKit坐標(biāo)系
3,但是我們?cè)谟肬IGraphicsGetCurrentContext()的時(shí)候刘陶,UIkit對(duì)于QuarzCore的坐標(biāo)系已經(jīng)做了調(diào)整狐血,所以我們不再需要重新翻轉(zhuǎn)坐標(biāo)系
如何證明:
- 下面我用Quarz2D新建一個(gè)上下文然后繪制圖形上去,得到的結(jié)果如下圖:
UIImage *image01 = [UIImage imageNamed:@"zhang.png"];
//之后我們用原生的坐標(biāo)系進(jìn)行繪圖看一下效果
//1,新建圖形上下文
UIGraphicsBeginImageContext(image01.size);
//2易核,獲取當(dāng)前圖形上下文,并把圖片打印在上下文中
CGContextRef context = UIGraphicsGetCurrentContext();
//注意:drawInRect:是UIKit框架封裝的方法浪默,所以這個(gè)里面既不需要上下文牡直,也不需要倒轉(zhuǎn)坐標(biāo)系
//[image01 drawInRect:CGRectMake(0, 0, image01.size.width, image01.size.height)];
/*
//如果用原生方法缀匕,坐標(biāo)系是按照Quarz 2D方式進(jìn)行的,所以需要轉(zhuǎn)換坐標(biāo)系
CGContextRotateCTM(context, M_PI);//順時(shí)針旋轉(zhuǎn)180度
CGContextScaleCTM(context, -1, 1);//然后左右對(duì)調(diào)(也就是向右翻轉(zhuǎn))
CGContextTranslateCTM(context, 0, -image01.size.height);//然后把旋轉(zhuǎn)時(shí)候高度損失補(bǔ)回來
*/
//如果關(guān)閉上述坐標(biāo)系轉(zhuǎn)換的代碼碰逸,得到的圖像是反轉(zhuǎn)的乡小,如下面的那張圖
CGContextDrawImage(context, CGRectMake(0, 0, image01.size.width, image01.size.height), image01.CGImage);
//3,從上下文中獲取圖片,并結(jié)束上下文
UIImage *image02 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(image02, 1);
[imageData writeToFile:@"/users/feng/desktop/zhang.jpg" atomically:YES];
//4饵史,把圖片顯示出來
UIImageView *imageView01 = [[UIImageView alloc] init];
imageView01.frame = CGRectMake(150, 100, 100, 100);
imageView01.backgroundColor = [UIColor redColor];
[self.view addSubview:imageView01];
imageView01.image = image02;
- 然后我們把上述的坐標(biāo)系轉(zhuǎn)換的代碼解開注釋满钟,如下:
//如果用原生方法,坐標(biāo)系是按照Quarz 2D方式進(jìn)行的胳喷,所以需要轉(zhuǎn)換坐標(biāo)系
CGContextRotateCTM(context, M_PI);//順時(shí)針旋轉(zhuǎn)180度
CGContextScaleCTM(context, -1, 1);//然后左右對(duì)調(diào)(也就是向右翻轉(zhuǎn))
CGContextTranslateCTM(context, 0, -image01.size.height);//然后把旋轉(zhuǎn)時(shí)候高度損失補(bǔ)回來
然后就可以得到正確的圖形湃番,如下: