Quartz 2D绘图(CoreGraphics)

Quartz 2D绘图(CoreGraphics)

1. Quartz概述

Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics(制图)。

共有两种部分组成Quartz:

Quartz Compositor,合成视窗系统,管理和合成幕后视窗影像来建立Mac OS X使用者接口。(了解,即幕后工作)

Quartz 2D,是iOS和Mac OS X环境下的二维绘图引擎。(熟练,幕前工作,由我们来操作的)

涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理,防锯齿渲染,生成PDF,以及PDF元数据相关处理

2. 绘制基本几何图形

视图绘制

在iOS上,所有的绘制,无论是否采用OpenGL、Quartz、UIKit、或者 Core Animation—都发生在UIView对象的区域内。

视图定义绘制发生的屏幕区域。如果您使用系统提供的视图,绘制工作会自动得到处理(以前使用的UIView就是)。然而,如果您定义自己的定制视图,则必须自行提供绘制代码(今天要做的)。

ps:

OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。2d游戏图形引擎用的就是它

视图绘制周期

iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。

描绘系统会调用UIView对象的drawRect:方法,并向它传入一个包含需要重画的视图区域的矩形。

在UIView中,重写drawRect: (CGRect) aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个drawRect方法一般情况下只会被调用一次.

1.drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

2.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。

3.当某些情况下想要手动重画这个View,只需要掉用[self setNeedsDisplay]方法即可.

setNeedsDisplay会调自动调用drawRect方法,这样可以拿到  UIGraphicsGetCurrentContext,就可以画画了。

图形上下文

在调用您提供的drawRect:方法之前,视图对象会自动配置其绘制环境,使您的代码可以立即进行绘制。作为这些

配置的一部分,UIView对象会为当前绘制环境创建一个图形上下文(对应于CGContextRef封装类型)。

该图形上下文包含绘制系统执行后续绘制命令所需要的信息,定义了各种基本的绘制属性,比如绘制使用的颜色、

裁剪区域、线的宽度及风格信息、字体信息、合成选项、以及几个其它信息。

绘制路径

路径用于描述由一序列线和Bézier曲线构成的2D几何形状。Core Graphics中也有一些用于创建简单路径(比如矩形和椭圆形)的便利函数。对于更为复杂的路径,必须用Core Graphics框架提供的函数自行创建。

//1.画线段

//    [self drawLine:contenxtRef];

//2.画三角形

//    [self drawTriangle:contenxtRef];

//3.画矩形

//    [self drawRectWithContextRef:contenxtRef];

//4.画圆

//    [self drawCircle:contenxtRef];

//5.扇形

//    [self drawArc:contenxtRef];

//6.曲线(贝塞尔曲线)

贝塞尔曲线:

Bézier曲线是法国数学家“贝塞尔”在工作中发现,任何一条曲线都可以通过与它相切的控制线两端的点的位置来定义。

是应用于二维图形应用程序的数学曲线。

也就是说,给个起点和终点,使用控制点就能确定一条曲线

3. 绘制图像和文本

UIImages的-drawRect:方法绘制图像:

- [UIImage drawAtPoint:(CGPoint)point]

- [UIImage drawInRect:(CGRect)rect]

- [UIImage drawAsPatternInRect:(CGRect)rect]

NSString的-drawRect:方法绘制文本:

- (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs

- (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs

API整理

1.  CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文

2.  CGContextMoveToPoint 开始画线

3.  CGContextAddLineToPoint 画直线

4.

5.  CGContextAddEllipseInRect 画一椭圆

6.  CGContextSetLineCap 设置线条终点形状

7.  CGContextSetLineDash 画虚线

8.  CGContextAddRect 画一方框

9.  CGContextStrokeRect 指定矩形

10.  CGContextStrokeRectWithWidth 指定矩形线宽度

11.  CGContextStrokeLineSegments 一些直线

12.

13.  CGContextAddArc 画已曲线 前俩店为中心 中间俩店为起始弧度 最后一数据为0则顺时针画 1则逆时针

14.  CGContextAddArcToPoint(context,0,0, 2, 9, 40);//先画俩条线从point 到 弟1点 , 从弟1点到弟2点的线  切割里面的圆

15.  CGContextSetShadowWithColor 设置阴影

16.  CGContextSetRGBFillColor 这只填充颜色

17.  CGContextSetRGBStrokeColor 画笔颜色设置

18.  CGContextSetFillColorSpace 颜色空间填充

19.  CGConextSetStrokeColorSpace 颜色空间画笔设置

20.  CGContextFillRect 补充当前填充颜色的rect

21.  CGContextSetAlaha 透明度

22.

23.  CGContextTranslateCTM 改变画布位置

24.  CGContextSetLineWidth 设置线的宽度

25.  CGContextAddRects 画多个线

26.  CGContextAddQuadCurveToPoint 画曲线

27.  CGContextStrokePath 开始绘制图片

28.  CGContextDrawPath 设置绘制模式

29.  CGContextClosePath 封闭当前线路

30.  CGContextTranslateCTM(context, 0, rect.size.height);    CGContextScaleCTM(context, 1.0, -1.0);反转画布

31.  CGContextSetInterpolationQuality 背景内置颜色质量等级

32.  CGImageCreateWithImageInRect 从原图片中取小图

33.

34. //字符串的 写入可用  nsstring本身的画图方法

35.  -(CGSize)drawInRect:(CGRect)rect

36.             withFont:(UIFont *)font

37.        lineBreakMode:(UILineBreakMode)lineBreakMode

38.            alignment:(UITextAlignment)alignment;来写进去即可

39.

40. //对图片放大缩小的功能就是慢了点

41.  UIGraphicsBeginImageContext(newSize);

42.  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

43.  UIGraphicsEndImageContext();

44.

45.  CGColorGetComponents() 返回颜色的各个直 以及透明度 可用只读const float 来接收  是个数组

46.

47. //画图片

48.  CGImageRef image=CGImageRetain(img.CGImage);

49.  CGContextDrawImage(context, CGRectMake(10.0, height - 100.0, 90.0, 90.0), image);

50.

51. //实现逐变颜色填充方法 CGContextClip(context);

52.  CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

53.  CGFloat colors[] =

54.     {

55.         204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,

56.         29.0 / 255.0, 156.0 / 255.0, 215.0 / 255.0, 1.00,

57.         0.0 / 255.0,  50.0 / 255.0, 126.0 / 255.0, 1.00,

58.     };

59.  CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));

60.  CGColorSpaceRelease(rgb);

61.  CGContextDrawLinearGradient(context, gradient,CGPointMake(0.0,0.0) ,CGPointMake(0.0,self.frame.size.height),

62.     kCGGradientDrawsBeforeStartLocation);

63.

64. //注:  画完图后,必须

65.     先用CGContextStrokePath来描线,即形状

66.     后用CGContextFillPath来填充形状内的颜色.

67.

68. //填充一个路径的时候,路径里面的子路径都是独立填充的。

69. //假如是重叠的路径,决定一个点是否被填充,有两种规则

70.  1,nonzero winding number rule:非零绕数规则,假如一个点被从左到右跨过,计数器+1,从右到左跨过,计数器-1,最后,如果结果是0,那么不填充,如果是非零,那么填充。

71.  2,even-odd rule: 奇偶规则,假如一个点被跨过,那么+1,最后是奇数,那么要被填充,偶数则不填充,和方向没有关系。

72.

73.

74.  CGContextEOFillPath //使用奇偶规则填充当前路径

75.  CGContextFillPath //使用非零绕数规则填充当前路径

76.  CGContextFillRect //填充指定的矩形

77.  CGContextFillRects //填充指定的一些矩形

78.  CGContextFillEllipseInRect //填充指定矩形中的椭圆

79.  CGContextDrawPath //两个参数决定填充规则,kCGPathFill表示用非零绕数规则,kCGPathEOFill表示用奇偶规则,kCGPathFillStroke表示填充,kCGPathEOFillStroke表示描线,不是填充

80.

81.

82. //设置当一个颜色覆盖上另外一个颜色,两个颜色怎么混合

83. //默认方式是

84.  result = (alpha * foreground) + (1 - alpha) * background

85.

86.  CGContextSetBlendMode :设置blend mode.

87.  CGContextSaveGState :保存blend mode.

88.  CGContextRestoreGState:在没有保存之前,用这个函数还原blend mode.

89.  CGContextSetBlendMode 混合俩种颜色

/*

1.Quartz2d  ios底层绘图图库,ios与mac平台

2.难(ios底层相关,与硬件操作相关的API基本都是纯c的)

3.实际开发中,只有针对性的开发,才会用到这个类库

绘制图标,线框图

4.能够绘制基本几何图形,绘制图像,文字,PDF文件,UI定制

5.要基于UIView去开发

*/

//11.

/**

运用变换

变换(transformation)修改了图形上下文中绘制图形的方式。可以通过移动、旋转或缩放实现变换。

Quartz提供了CTM(current transformation matrix)变换,这种变换比较简单,函数有:

CGContextRotateCTM,旋转坐标

CGContextScaleCTM,缩放坐标

CGContextTranslateCTM,移动原点

*/

- (void)transformation:(CGContextRef)contenxtRef

{

//注意绘图是有先后顺序关系的

UIImage *image = [UIImage imageNamed:@"head.jpg"];

[image drawAtPoint:CGPointMake(10, 10)];

//移动变换

//    CGContextTranslateCTM(contenxtRef, 100, 50);

//从对象角度沿着x轴正向移动100单位,沿着y轴正向移动50单位。

//旋转变换

CGContextRotateCTM (contenxtRef, 45*M_PI/180);

//    从对象角度:在Quartz坐标下正数为逆时针旋转,负数为顺时针旋转。在UIKit坐标下正数为顺时针旋转,负数为逆时针旋转。

CGRect touchRect = CGRectMake(0, 0, 100, 100);

CGContextDrawImage(contenxtRef, touchRect, image.CGImage);

CGContextRestoreGState(contenxtRef);

//缩放变换

//    CGContextScaleCTM (contenxtRef, .5, .75);

//从对象角度:所有x坐标缩小0.5,所有y坐标缩小0.75。

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容