zoukankan      html  css  js  c++  java
  • iOS开发 绘图详解

    Quartz概述

    Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics.共有两种部分组成
     
    Quartz Compositor,合成视窗系统,管理和合成幕后视图影像来建立Mac OS X使用者接口。
    Quartz 2D,是ios和mac os x环境下的二维绘图引擎。
    涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理。防锯齿渲染,生成PDF,以及PDF元数据相关处理。
     
    视图绘制
     
    在ios上,所有的绘制,无论是否采用OpenGL、Quartz、UIKit、或者Core Animation-----都发生在UIView对象的区域内。视图定义绘制发生的屏幕区域。如果您使用系统提供的视图,绘制工作会自动得到处理。然而,如果您定义自己的定制视图,则必须自行提供绘制代码。
     
    对于使用OpenGL进行绘制的应用程序。一旦建立了渲染表面,就必须使用OpenGL制定的绘制模型。
    视图绘制周期
     
    描绘系统会调用UIView对象的drawRect:方法,并向它传人一个包含需要重画的视图区域的矩形,触发视图更新的动作有如下几种:
    对遮挡您的视图的其他视图进行移动或删除操作。
    将视图的hidden属性声明设置为NO,使其从隐藏状态变为可见。
    将视图滚出屏幕,然后再重新回到屏幕上。
    显示调用视图的setNeedsDisPlay或者setNeedsDisplayRect:方法。
    setNeedsDisplay是更新整个视图。
    setNeedsDisplayInRect是更新视图的部分区域。
    视图绘制实例FirstQuartz2D
     
     
    CGContextRef context = UIGraphicsGetCurrentContext();   设置上下文
    CGContextMoveToPoint            开始画线
    CGContextAddLineToPoint        画直线
     
    CGContextAddEllipseInRect     画一椭圆
    CGContextSetLineCap       设置线条终点形状
    CGContextSetLineDash  画虚线
    CGContextAddRect   画一方框
    CGContextStrokRect   指定矩形
    CGContextStrokeLineWithWidth   指定矩形线宽度
    CGContextStrokeLineSegments  一些直线
     
    CGContextAddArc 画一曲线, 前两点为中心,中间两点为起始弧度,最后一数据位0则顺时针画,1则逆时针
    CGContextAddArcToPoint(context,0,0,2,9,40);//线画两条线从point到第一点,从第一点到第2点的线 切割里面的圆。
    CGContextSetShadowWithColor 设置阴影
    CGContextSetRGBFillColor  这只填充颜色
    CGContextSetRGBStrokeColor 画笔颜色设置
    CGContextSetFillColorSpace  颜色空间填充
    CGContextSetStrokeColorSpace颜色空间画壁设置
    CGContextFillRect补充当前填充颜色的rect
    CGContextSetAlaha透明度
     
     
    CGContextTranslateCTM 改变画布的位置
    CGContextSetLineWidth设置线的宽度
    CGContextAddQuadCurveToPoint画曲线
    CGContextStrokePath 开始绘制图片
    CGContextDrawPath  设置绘制模式
    CGContextClosePath 封闭当前线路
    CGContextTranslateCTM(context,0,rect,size.height);
    CGContextScaleCTM(context,1.0,-1.0,-1.0);翻转画布
    CGContextSetInterpolationQuality背景内置颜色质量等级
    CGImageCreateWithImageRect 从原图片中去小图。
     
    字符串的写入可用NSString本身的画图方法 -(CGSize)drawInRect:(CGRect)rect withFont;(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode alignment:(UItextAlignment)alignment;来写进去即可
     
    对图片放大缩小的功能就是慢了点
    UIGraphicsBeginImageContext(newSize);
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
     
    CGColorGetComponents ()返回颜色的各个值,以及透明度,可用只读const float 来接受是个数组
     
    画图片
     CGImageRefimage = CGImageRetain(img.CGImage);
    CGContextDrawImage(context.CGRectMake(10.0,height-100.0,90.0,90.0),image);
     
    实现渐变颜色填充方法
    CGContextClip(context);
    CGFloat color [] = 
    {

           204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,

            29.0 / 255.0, 156.0 / 255.0, 215.0 / 255.0, 1.00,

            0.0 / 255.0,  50.0 / 255.0, 126.0 / 255.0, 1.00,

    };
     
    CGGradientRef gradient= CGGradientCreateWithColorComponents(rgb,colors,NULL,sizeof(colors)/(sizeof(colors[0])*4));
    CGColorSpaceRelease(rgb);
    CGContextDrawLinearGradient(context,gradient,CGPointMake(0.0,0.0),CGPointMake(0.0,self.frame.size.height),KCGGradientDrawsBeforStartLocation);
     
    注:画完图后,必须先用CGContextStrokePath来描线,即形状
    后用CGContextFillPath来填充形状内的颜色。
     
    填充一个路径的时候,路径里面的子路径都市独立填充的。假如是重叠的路径,决定一个点是否被填充,有两种规则
    1、nonzero Winding number rule:非零绕数规则,假如一个点被从左到有跨过,计数器+1,从右到左跨过,计数器-1,最后,如果结果是0,那么不填充,如果是非零,那么填充。
    2、event-odd rule;奇偶规则,假如一个点被跨过,那么是奇数,那么要被填充,和方向没有关系。
     

     Function

    Description 

     CGContextEOFillPath

     使用奇偶规则填充当前路径

     CGContextFillPath

     使用非零绕数规则填充当前路径

     CGContextFillRect

     填充指定的矩形

     CGContextFillRects

     填充指定的一些矩形

     CGContextFillEllipseInRect

     填充指定矩形中的椭圆

     CGContextDrawPath

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

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

    默认方式是

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

    CGContextSetBlendMode :设置blend mode.

    CGContextSaveGState :保存blend mode.

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

    CGContextSetBlendMode 混合俩种颜色

     
     
     
     
     
  • 相关阅读:
    复习一些奇怪的题目
    NOIP 考前 KMP练习
    NOIP 考前 并查集复习
    NOIP 考前 Tarjan复习
    NOIP 考前 图论练习
    BZOJ 1468 树分治
    Codeforces Round #376 (Div. 2)
    CodeVS 线段覆盖1~5
    Luogu 3396 权值分块
    BZOJ 2743 树状数组
  • 原文地址:https://www.cnblogs.com/moyunmo/p/3600151.html
Copyright © 2011-2022 走看看