Quartz 2D 的一些使用

Quartz 2D是一个绘图框架,最近看了一下它的官方文档以及提供的的demo。看着这些资料自己做了一些小结。

1、线段的绘制 (绘制一条线段)

    //获取图像上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //设置线条颜色
    CGContextSetRGBStrokeColor(context, .5, .5, .5, 1);
    //设置线条宽度
    CGContextSetLineWidth(context, 1);
    //设置起点
    CGContextMoveToPoint(context, 10, 60);
    //设置终点
    CGContextAddLineToPoint(context, 300, 90);
    //闭合
    CGContextStrokePath(context);

  绘制多条线段

    CGPoint addLines[] = {
        CGPointMake(100, 100),
        CGPointMake(200, 100),
        CGPointMake(200, 200),
        CGPointMake(100, 200),
        CGPointMake(100, 100),
    };
    //绘制多个点的线段
    CGContextAddLines(context, addLines, sizeof(addLines)/sizeof(addLines[0]));

CGContextSetLineJoin(context, kCGLineJoinRound);

    CGContextStrokePath(context);

    CGPoint stroleSegMents[] = {
        CGPointMake(100, 300),
        CGPointMake(200, 300),
        CGPointMake(200, 400),
        CGPointMake(100, 400),
        CGPointMake(300, 300),
    };

    CGContextStrokeLineSegments(context, stroleSegMents, sizeof(stroleSegMents)/sizeof(stroleSegMents[0]));

  线段的样式设置

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGFloat len[] = {10,10};
    CGContextSetAlpha(context, .5);
    //设置线段的样式  可以通过这种方式来绘制虚线
    CGContextSetLineDash(context, 10, len, sizeof(len)/sizeof(len[0]));
    CGContextAddRect(context, CGRectMake(100, 100, 200, 200));
    CGContextStrokePath(context);

2、矩形

  

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddRect(context, CGRectMake(100, 100, 100, 100));
    CGContextFillPath(context);
    //CGContextStrokePath(context);

    CGContextStrokeRect(context, CGRectMake(250, 100, 100, 100));

    CGRect rec[] = {
        CGRectMake(100, 220, 100, 100),
        CGRectMake(100, 320, 100, 100),
        CGRectMake(100, 420, 100, 100),

    };
    CGContextAddRects(context, rec, sizeof(rec)/sizeof(rec[0]));
    CGContextStrokePath(context);

    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 2.0);
    CGPoint center;
    center = CGPointMake(90.0, 150.0);
    CGContextMoveToPoint(context, center.x, center.y + 60.0);
    for(int i = 1; i < 3; ++i)
    {
        CGFloat x = 60.0 * sinf(i * 4.0 * M_PI / 5.0);
        CGFloat y = 60.0 * cosf(i * 4.0 * M_PI / 5.0);
        CGContextAddLineToPoint(context, center.x + x, center.y + y);
    }
    CGContextClosePath(context);
    center = CGPointMake(210.0, 310.0);
    CGContextMoveToPoint(context, center.x, center.y + 60.0);
    for(int i = 1; i < 6; ++i)
    {
        CGFloat x = 60.0 * sinf(i * 2.0 * M_PI / 6.0);
        CGFloat y = 60.0 * cosf(i * 2.0 * M_PI / 6.0);
        CGContextAddLineToPoint(context, center.x + x, center.y + y);
    }
    CGContextClosePath(context);
    CGContextDrawPath(context, kCGPathEOFill);

3、弧度(圆)

    CGContextRef context = UIGraphicsGetCurrentContext();
    //通过矩形范围绘制
    CGContextAddEllipseInRect(context, CGRectMake(60.0, 100.0, 60.0, 60.0));
    CGContextStrokePath(context);

    CGContextStrokeEllipseInRect(context, CGRectMake(30.0, 180.0, 60.0, 60.0));

    //填充绘制
    CGContextFillEllipseInRect(context, CGRectMake(30.0, 290.0, 60.0, 60.0));

    /**
     *  参数从左之右
        图形上下文   x,y 弧度 起点弧度,终点弧度 ,是否顺时针
     */
    CGContextAddArc(context, 180, 160, 100.0, -M_PI/2, M_PI, false);
    CGContextStrokePath(context);

    CGContextAddArc(context, 170.0, 160.0, 60.0, M_PI/4.0, M_PI, true);
    CGContextStrokePath(context);

    CGContextAddArc(context, 150.0, 150.0, 30.0, 0.0, M_PI/2.0, false);
    CGContextAddArc(context, 150.0, 150.0, 30.0, 3.0*M_PI/2.0, M_PI, true);
    CGContextStrokePath(context);

    CGContextAddArc(context, 150.0, 340.0, 30.0, 0.0, M_PI/2.0, false);
    CGContextAddArc(context, 150.0, 340.0, 30.0, M_PI, 3.0*M_PI/2.0, false);
    CGContextStrokePath(context);

    CGPoint p[3] =
    {
        CGPointMake(310.0, 30.0),
        CGPointMake(310.0, 60.0),
        CGPointMake(340.0, 60.0),
    };
    CGContextMoveToPoint(context, p[0].x, p[0].y);
    CGContextAddArcToPoint(context, p[1].x, p[1].y, p[2].x, p[2].y, 30.0);
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
    CGContextAddLines(context, p, sizeof(p)/sizeof(p[0]));
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, .5, 1.0, 1.0, 1.0);
    CGContextSetLineWidth(context, 2.0);

    CGPoint s = CGPointMake(30.0, 320.0);
    CGPoint e = CGPointMake(300.0, 320.0);
    CGPoint cp1 = CGPointMake(320.0, 30.0);
    CGPoint cp2 = CGPointMake(210.0, 210.0);
    CGContextMoveToPoint(context, s.x, s.y);
    CGContextAddCurveToPoint(context, cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, 1.0, 0.5, 0.0, 1.0);
    CGContextMoveToPoint(context, s.x, s.y);
    CGContextAddLineToPoint(context, cp1.x, cp1.y);
    CGContextMoveToPoint(context, e.x, e.y);
    CGContextAddLineToPoint(context, cp2.x, cp2.y);
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, .5, 1.0, 1.0, 1.0);
    s = CGPointMake(30.0, 300.0);
    e = CGPointMake(270.0, 300.0);
    cp1 = CGPointMake(150.0, 180.0);
    CGContextMoveToPoint(context, s.x, s.y);
    CGContextAddQuadCurveToPoint(context, cp1.x, cp1.y, e.x, e.y);
    CGContextStrokePath(context);

    CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
    CGContextMoveToPoint(context, s.x, s.y);
    CGContextAddLineToPoint(context, cp1.x, cp1.y);
    CGContextStrokePath(context);

4 、通过图片绘制

    CGContextRef context = UIGraphicsGetCurrentContext();
    //翻转坐标系
    CGContextTranslateCTM(context, 0.0, self.frame.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGImageRef img = [UIImage imageNamed:@"1024x1024"].CGImage;
    CGContextDrawImage(context, CGRectMake(30, 80, 60, 60), img);
    CGContextDrawTiledImage(context, CGRectMake(30, 80, 60, 60), img);
    CGContextStrokePath(context);

5、通过pdf文件绘制

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, self.frame.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),CFSTR("input_pdf.pdf"),NULL,NULL);
    CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(pdfURL);
    CFRelease(pdfURL);

    CGPDFPageRef page = CGPDFDocumentGetPage(document, size_page);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, self.bounds, 0, true);
    CGContextConcatCTM(context, pdfTransform);

    CGContextDrawPDFPage(context, page);
时间: 2024-10-24 19:05:10

Quartz 2D 的一些使用的相关文章

Quartz 2D编程指南(7) - 阴影(Shadows)

阴影是绘制在一个图形对象下的且有一定偏移的图片,它用于模拟光源照射到图形对象上所形成的阴影效果,如果7-1所示.文本也可以有阴影.阴影可以让一幅图像看上去是立体的或者是浮动的. 阴影有三个属性: 1.x偏移值,用于指定阴影相对于图片在水平方向上的偏移值. 2.y偏移值,用于指定阴影相对于图片在竖直方向上的偏移值. 3.模糊(blur)值,用于指定图像是有一个硬边(hard edge,如图7-2左边图片所示),还是一个漫射边(diffuse edge,如图7-1右边图片所示) 本章将描述阴影是如何

Quartz 2D Programming Guide

Quartz 2D Programming  Guide 官方文档: Quartz 2D Programming Guide 译文: Quartz 2D编程指南(1) - 概览 Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts) Quartz 2D编程指南(3) - 路径(Paths)[上] Quartz 2D编程指南(3) - 路径(Paths)[下] Quartz 2D编程指南(4) - 颜色和颜色空间 Quartz 2D编程指南(5) - 变换 Quar

iOS开发——图形编程OC篇&amp;(六)Quartz 2D高级使用(二)

Quartz 2D高级使用 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. 2.把绘图信息添加到路径里边. 以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息. 在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef. 3.把路径

iOS开发——图形编程OC篇&amp;(三)Quartz 2D绘图

绘图 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 决定绘制的输出目标(绘制到什么地方去?)(输出目标可以是PDF文件.Bitmap或者显示器的窗口上) 相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上. Quartz2D提供了以下几种类型的Graphics Context: Bitmap Graphics Context PDF Graphics

iOS开发——图形编程OC篇&amp;(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

Quartz 2D简介

1.Quartz 2D是一种二维绘图库,它与iphone OS紧密结合在一起,能协同所有相关框架进行工作,包括Core Animation.OpenGL ES和UIKit. 2.Quartz的绘图功能取决与3个核心概念:上下文.路径和状态. ①上下文(context):用户描述将图形写入哪里,该过程由CGContextRef定义.通常,可以写入UIView或位图中. ②路径:路径是那些经常在Quartz中绘制的内容.起初,他们是线段和弧的集合,随后通过描边或填充的方式绘制到屏幕中. ③状态:状态

Quartz 2D - 5.变换(Transforms)

Quartz 2D 绘制模型定义了两种独立的坐标空间:用户空间(用于表现文档页)和设备空间(用于表现设备的本地分辨率).用户坐标空间用浮点数表示坐标,与设备空间的像素分辨率没有关系.当我们需要一个点或者显示文档时, Quartz会将用户空间坐标系统映射到设备空间坐标系统.因此,我们不需要重写应用程序或添加额外的代码来调整应用程序的输出以适应不同的设备. 我们可以通过操作CTM(current transformation matrix)来修改默认的用户空间.在创建图形上下文后,CTM是单位矩阵,

Quartz 2D绘制简单图形

在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UIKit class QuartzView: UIView { // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance duri

IOS开发—Quartz 2D介绍

Quartz 2D学习记录 Quartz 2D简单介绍 一.什么是Quartz 2D Quarz 2D是一个二维绘画引擎,同时支持ios和mac,其API是Core Graphics框架的,是纯C语言的.IOS系统提供的大部分控件的内容都是通过Quartz 2D画出来的,因此Quartz 2D的一个很重要的价值是:自定义view(自定义UI控件). 二.一个重要的概念:图形上下文 图形上下文(Graphics context)是一个CGContextRef数据,其作用是: 保存绘图信息.绘图属性