1、簡單說明app
圖形上下文(Graphics Context):是一個CGContextRef類型的數據函數
圖形上下文的做用:保存繪圖信息、繪圖狀態atom
決定繪製的輸出目標(繪製到什麼地方去?)(輸出目標能夠是PDF文件、Bitmap或者顯示器的窗口上)spa
相同的一套繪圖序列,指定不一樣的Graphics Context,就可將相同的圖像繪製到不一樣的目標上。3d
Quartz2D提供瞭如下幾種類型的Graphics Context:code
Bitmap Graphics Context對象
PDF Graphics Contextblog
Window Graphics Context圖片
Layer Graphics Contextip
Printer Graphics Context
只要上下文不一樣,繪製的地方就不一樣。
本文說明如何把圖片繪製到Bitmap上面去,即要求生成一張圖片,圖片上面保存了繪圖信息。
Bitmap就是圖片,至關於系統的UIimage。一個UIImage就是一個Bitmap
2、怎麼把圖片繪製到Bitmap上?
注意:不能在drawRect:方法中直接獲取Bitmap的上下文,須要咱們本身進行建立。
代碼示例:
1 // 2 // YYViewController.m 3 // 06-繪製基本圖形 4 // 5 // Created by apple on 14-6-22. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 11 @interface YYViewController () 12 @property (weak, nonatomic) IBOutlet UIImageView *iv; 13 @end 14 15 @implementation YYViewController 16 17 - (void)viewDidLoad 18 { 19 [super viewDidLoad]; 20 21 //加載圖片 22 //0.建立一個Bitmap上下文 23 //c語言的方法 24 // CGBitmapContextCreate(<#void *data#>, <#size_t width#>, <#size_t height#>, <#size_t bitsPerComponent#>, <#size_t bytesPerRow#>, <#CGColorSpaceRef space#>, <#CGBitmapInfo bitmapInfo#>) 25 //oc中封裝的方法 26 //方法1 27 // UIGraphicsBeginImageContext(<#CGSize size#>); 28 //方法2 29 UIGraphicsBeginImageContextWithOptions( CGSizeMake(200, 200), NO, 0); 30 //1.獲取bitmap上下文 31 CGContextRef ctx = UIGraphicsGetCurrentContext(); 32 //2.繪圖(畫一個圓) 33 CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100)); 34 //3.渲染 35 CGContextStrokePath(ctx); 36 //4.獲取生成的圖片 37 UIImage *image=UIGraphicsGetImageFromCurrentImageContext(); 38 //5.顯示生成的圖片到imageview 39 self.iv.image=image; 40 //6.保存繪製好的圖片到文件中 41 //先將圖片轉換爲二進制數據,而後再將圖片寫到文件中 42 // UIImageJPEGRepresentation(image, 1); //第二個參數爲保存的圖片的效果 43 NSData *data=UIImagePNGRepresentation(image); 44 [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES]; 45 } 46 47 - (void)didReceiveMemoryWarning 48 { 49 [super didReceiveMemoryWarning]; 50 // Dispose of any resources that can be recreated. 51 } 52 53 @end
程序執行效果:
程序執行完畢後,會在指定的位置建立一個abc.png的圖片
補充說明:
//方法1 UIGraphicsBeginImageContext(<#CGSize size#>);
//方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)
CGSize size:指定未來建立出來的bitmap的大小
BOOL opaque:設置透明YES表明透明,NO表明不透明
CGFloat scale:表明縮放,0表明不縮放
建立出來的bitmap就對應一個UIImage對象
2.Quartz2D的內存管理
使用含有「Create」或「Copy」的函數建立的對象,使用完後必須釋放,不然將致使內存泄露
使用不含有「Create」或「Copy」的函數獲取的對象,則不須要釋放
若是retain了一個對象,再也不使用時,須要將其release掉
可使用Quartz 2D的函數來指定retain和release一個對象。例如,若是建立了一個CGColorSpace對象,則使用函數CGColorSpaceRetain和CGColorSpaceRelease來retain和release對象。
也可使用Core Foundation的CFRetain和CFRelease。注意不能傳遞NULL值給這些函數