天天看點

iOS開發UI篇—Quartz2D使用(繪制基本圖形)

iOS開發UI篇—Quartz2D使用(繪制基本圖形)

一、簡單說明

圖形上下文(Graphics Context):是一個CGContextRef類型的資料

圖形上下文的作用:儲存繪圖資訊、繪圖狀态

決定繪制的輸出目标(繪制到什麼地方去?)(輸出目标可以是PDF檔案、Bitmap或者顯示器的視窗上)

iOS開發UI篇—Quartz2D使用(繪制基本圖形)
相同的一套繪圖序列,指定不同的Graphics Context,就可将相同的圖像繪制到不同的目标上。
iOS開發UI篇—Quartz2D使用(繪制基本圖形)

Quartz2D提供了以下幾種類型的Graphics Context:

Bitmap Graphics Context

PDF Graphics Context

Window Graphics Context

Layer Graphics Context

Printer Graphics Context

隻要上下文不同,繪制的地方就不同。

本文說明如何把圖檔繪制到Bitmap上面去,即要求生成一張圖檔,圖檔上面儲存了繪圖資訊。

Bitmap就是圖檔,相當于系統的UIimage。一個UIImage就是一個Bitmap

二、怎麼把圖檔繪制到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      

程式執行效果:

iOS開發UI篇—Quartz2D使用(繪制基本圖形)

程式執行完畢後,會在指定的位置建立一個abc.png的圖檔

iOS開發UI篇—Quartz2D使用(繪制基本圖形)

補充說明:

1.建立Bitmap圖形上下文的方法

  //方法1   UIGraphicsBeginImageContext(<#CGSize size#>);

  //方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)

使用兩個方法同樣都可以建立,但是使用第一個方法将來建立的圖檔清晰度和品質沒有第二種方法的好。

方法2接收三個參數:

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值給這些函數

繼續閱讀