CGContext图形上下文详解

CGContextSaveGState函数的作用是将当前图形状态推入堆栈。之后,您对图形状态所做的修改会影响随后的描画操作,但不影响存储在堆栈中的拷贝。在修改完成后,您可以通过CGContextRestoreGState函数把堆栈顶部的状态弹出,返回到之前的图形状态。这种推入和弹出的方式是回到之前图形状态的快速方法,避免逐个撤消所有的状态修改;这也是将某些状态(比如裁剪路径)恢复到原有设置的唯一方式。

CGContextSaveGState:压栈操作,保存一份当前图形上下文
CGContextRestoreGState:出栈操作,恢复一份当前图形上下文

CTM(current transformation matrix当前转换矩阵)
CGContextScaleCTM:坐标系X,Y缩放
CGContextTranslateCTM:坐标系平移
CGContextRotateCTM:坐标系旋转
CGContextConcatCTM
CGContextGetCTM:获得一份CTM

CGContextSetLineWidth
CGContextSetLineCap
CGContextSetLineJoin
CGContextSetMiterLimit
CGContextSetLineDash
CGContextSetFlatness
CGContextSetAlpha://设置透明度

CGContextSetBlendMode

CGContextBeginPath
CGContextMoveToPoint:画笔移动到该点开始画线
CGContextAddLineToPoint:画直线到该点
CGContextAddCurveToPoint:画三次曲线函数

CGContextAddQuadCurveToPoint:画二次曲线

CGContextClosePath:闭合曲线
CGContextAddRect:画矩形

CGContextAddRects
CGContextAddLines

CGContextAddEllipseInRect

CGContextAddArc
CGContextAddArcToPoint

CGContextAddPath
CGContextCopyPath

CGContextReplacePathWithStrokedPath
CGContextIsPathEmpty:表示目前的图形上下文是否包含任何的子路径。

CGContextGetPathCurrentPoint:返回一个非空的路径中的当前点。

CGContextGetPathBoundingBox:返回包含当前路径的最小矩形。

CGContextPathContainsPoint:检查当前路径中是否包含指定的点。

CGContextStrokePath
CGContextDrawPath

CGContextFillPath://填充路径
CGContextEOFillPath://奇偶填充

CGContextFillRect://
CGContextStrokeRect

CGContextFillRects
CGContextStrokeRectWithWidth
CGContextClearRect
CGContextFillEllipseInRect
CGContextStrokeEllipseInRect
CGContextStrokeLineSegments

CGContextClip
CGContextEOClip
CGContextClipToMask
CGContextGetClipBoundingBox
CGContextClipToRect
CGContextClipToRects

  • Quartz 中的颜色是用一组数值来表示。而颜色空间用于解析这些颜色信息,常用颜色空间有 RGB 、CMYK等。
  • Quartz 支持通用颜色空间、设备独立颜色空间、设备依赖颜色空间、索引颜色空间和模式(Pattern)颜色空间。
  • iOS不支持设备独立颜色空间和通用颜色空间。iOS应用程序必须使用设备颜色空间。

  • *调用如下函数来便捷的使用 CGColor 设置颜色值并使用 CGColor 指定的颜色空间

Quartz 中的颜色是用一组数值来表示。而颜色空间用于解析这些颜色信息,常用颜色空间有 RGB 、CMYK等。

Quartz 支持 通用颜色空间、设备独立颜色空间、设备依赖颜色空间、索引颜色空间和模式(Pattern)颜色空间。

iOS不支持 设备独立颜色空间和通用颜色空间。iOS应用程序必须使用设备颜色空间。

  • CGColorSpaceCreateDeviceGray() 创建设备依赖灰度颜色空间。
  • CGColorSpaceCreateDeviceRGB() 创建设备依赖RGB颜色空间。
  • CGColorSpaceCreateDeviceCMYK() 创建设备依赖CMYK颜色
    空间。

CGContextSetFillColorSpace
CGContextSetStrokeColorSpace

CGContextSetFillColor
CGContextSetStrokeColor

CGContextSetGrayFillColor
CGContextSetGrayStrokeColor

  • *调用如下函数来便捷的设置设备依赖CMYK颜色空间并设置颜色值。

CGContextSetRGBFillColor
CGContextSetRGBStrokeColor

CGContextSetCMYKFillColor
CGContextSetCMYKStrokeColor

  • *调用如下函数来便捷的设置设备依赖CMYK颜色空间并设置颜色值。

CGContextSetRenderingIntent:设置再现意图

每个设备都有固定的可复制的颜色范围(gamut),这是设备的物理性质决定的。当图像从一个颜色空间向另一个颜色空间转换时,有些源设备颜色空间中呈现的颜色,不能在目标设备颜色空间中复制出来,这些不能复制的颜色叫色域外(out-of-gamut)颜色。比如 RGB 颜色空间比 CMYK 的颜色空间要大,有些在显示器上能显示的颜色不能在打印机上同样打印出来。因为我们不能在目标设备颜色空间中复制出色域外颜色,我们必须用一些其他颜色来替代他们。颜色空间转换时颜色替换调整的规则就是再现意图。更详细的说明可以查看 这里 和 这里

  • 再现意图用于指定如何将源颜色空间的颜色映射到图形上下文的目标颜色空间的颜色范围内。
  • 如果不显式的指定再现意图,Quartz 使用”相对色度再现意图”应用于所有绘制(不包含位图图像)。
  • 对于位图图像,Quartz默认使用”感知再现意图”。
  • 调用 CGContextSetRenderingIntent(context, kCGRenderingIntentDefault) 来设置再现意图。
  • 再现意图共有以下 5 种

1 kCGRenderingIntentDefault:默认再现意图。
2 kCGRenderingIntentAbsoluteColorimetric:绝对色度再现意图。将输出设备颜色域外的颜色映射为输出设备域内与之最接近的颜色。这可以产生一个裁减效果,因为色域外的两个不同的颜色值可能被映射为色域内的同一个颜色值。当图形使用的颜色值同时包含在源色域及目标色域内时,这种方法是最好的。常用于logo或者使用专色(spot color)时。
3 kCGRenderingIntentRelativeColorimetric:相对色度再现意图。转换所有的颜色(包括色域内的),以补偿图形上下文的白点与输出设备白点之间的色差。
4 kCGRenderingIntentPerceptual:感知再现意图。通过压缩图形上下文的色域来适应输出设备的色域,并保持源颜色空间的颜色之间的相对性。感知渲染意图适用于相片及其它复杂的高细度图片。
5 kCGRenderingIntentSaturation:饱和度再现意图。把颜色转换到输出设备色域内时,保持颜色的相对饱和度。结果是包含亮度、饱和度颜色的图片。饱和度意图适用于生成低细度的图片,如描述性图表。

CGContextDrawImage:在指定区域画图片

CGContextDrawTiledImage
CGContextGetInterpolationQuality:返回当前的图形上下文的插值(插值(Interpolation)是在不天生像素的环境下增长图像像素大小的一种方法,在周围像素色彩
的根蒂根基上用算术公式计算亡失像素的色彩。)质量水平
CGContextSetInterpolationQuality:设置图形上下文的插值质量水平。

CGContextSetShadowWithColor
CGContextSetShadow

阴影是如何工作的
Quartz中的阴影是图形状态的一部分。我们可以调用函数CGContextSetShadow来创建,并传入一个图形上下文、偏移值及模糊值。阴影被设置后,任何绘制的对象都有一个阴影,且该阴影在设备RGB颜色空间中呈现出黑色的且alpha值为1/3。换句话说,阴影是用RGBA值{0, 0, 0, 1.0/3.0}设置的。
我们可以调用函数CGContextSetShadowWithColor来设置彩色阴影,并传递一个图形上下文、 偏移值、模糊值有CGColor颜色对象。颜色值依赖于颜色空间。
如何在调用CGContextSetShadow或CGContextSetShadowWithColor之前保存了图形状态,我们可以通过恢复图形状态来关闭阴影。我们也可以通过设置阴影颜色为NULL来关闭阴影

CGContextDrawLinearGradient
CGContextDrawRadialGradient

CGContextDrawShading

CGContextSetCharacterSpacing
CGContextSetTextPosition
CGContextGetTextPosition
CGContextSetTextMatrix
CGContextGetTextMatrix
CGContextSetTextDrawingMode
CGContextSetFont
CGContextSetFontSize
CGContextShowGlyphsAtPositions

CGContextDrawPDFPage: 绘制一个PDF页面到当前的用户空间

CGContextBeginPage
CGContextEndPage

CGContextRetain
CGContextRelease
CGContextSynchronize

CGContextSetShouldAntialias:设置图形上下文的抗锯齿开启或关闭。
CGContextSetAllowsAntialiasing

CGContextSetShouldSmoothFonts
CGContextSetAllowsFontSmoothing
CGContextSetShouldSubpixelPositionFonts
CGContextSetAllowsFontSubpixelPositioning
CGContextSetShouldSubpixelQuantizeFonts
CGContextSetAllowsFontSubpixelQuantization

Quartz的透明层类似于许多流行的图形应用中的层。层是独立的实体。Quartz维护为每个上下文维护一个透明层栈,并且透明层是可以嵌套的。但由于层通常是栈的一部分,所以我们不能单独操作它们。

我们通过调用函数CGContextBeginTransparencyLayer来开始一个透明层,该函数需要两个参数:图形上下文与CFDictionary对象。字典中包含我们所提供的指定层额外信息的选项,但由于Quartz 2D API中没有使用字典,所以我们传递一个NULL。在调用这个函数后,图形状态参数保持不变,除了alpha值[默认设置为1]、阴影[默认关闭]、混合模式[默认设置为normal]、及其它影响最终组合的参数。

在开始透明层操作后,我们可以绘制任何想显示在层上的对象。指定上下文中的绘制操作将被当成一个组合对象绘制到一个透明背景上。这个背景被当作一个独立于图形上下文的目标缓存。

当绘制完成后,我们调用函数CGContextEndTransparencyLayer。Quartz将结合对象放入上下文,并使用上下文的全局alpha值、阴影状态及裁减区域作用于组合对象。

在透明层中绘制需要三步:

CGContextBeginTransparencyLayer:直到相应的调用CGContextEndTransparencyLayer,在指定范围内的所有后续绘制操作组合到一个完全透明的背景(它被视为一个单独的目标缓冲区从上下文)
CGContextBeginTransparencyLayerWithRect
CGContextEndTransparencyLayer

CGContextGetUserSpaceToDeviceSpaceTransform
CGContextConvertPointToDeviceSpace
CGContextConvertPointToUserSpace
CGContextConvertSizeToDeviceSpace
CGContextConvertSizeToUserSpace
CGContextConvertRectToDeviceSpace
CGContextConvertRectToUserSpace

Original: https://www.cnblogs.com/Free-Thinker/p/15740314.html
Author: brave-sailor
Title: CGContext图形上下文详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545724/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【软考】信息安全审计

    1.概念 安全审计(Security Audit)是记录、审查主体对客体进行访问和使用情况,保证安全规则被正确执行,并帮助分析安全事故产生的原因。 安全审计系统采用数据挖掘和数据仓…

    技术杂谈 2023年5月31日
    0102
  • flexible如何实现自动判断dpr?

    判断机型, 找出样本机型去适配. 比如iphone以6为样本, 宽度375px, dpr是2 Java Program! Original: https://www.cnblogs…

    技术杂谈 2023年5月31日
    0111
  • 设置Tab键缩进2字符

    默认是1.74cm,是1.5字符。 论文是4个空格显示为4个点,或者全角下2个空格,显示为2个空格框。看上方的首航缩进标志是否在2. 看图 在段落 格式里面进行设置! 点上图的制表…

    技术杂谈 2023年5月31日
    0107
  • AtCoder Beginner Contest 223

    AtCoder Beginner Contest 223 A是纯纯的水题,就不说了 B – String Shifting 思路分析 我真的sb,一开始想了好久是不是和…

    技术杂谈 2023年7月24日
    086
  • subprocess模块简介

    subprocess模块可以执行系统命令,该模块允许用户创建一个新的进程,该进程会连接到input|output|error管道并获取到返回的状态码。 本文版本是以python3….

    技术杂谈 2023年7月11日
    0109
  • HTML怎么设置图片大小

    html插入图片有两种方式:一种是通过标签插入的正常的图片,另一种是通过css样式插入的背景图片 1、首先你是通过第二种方式插入的是背景图片,直接用width和height只能控制…

    技术杂谈 2023年6月21日
    092
  • 梯度下降算法

    一、基本概念 梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代能使待优化的目标函数逐步减小。梯度下降法是2范数下的最速下降法。 最速下降法的一种简单形式是:…

    技术杂谈 2023年5月31日
    0120
  • 我又造了个轮子:GrpcGateway

    我个人对 _GRPC_是比较感兴趣的,最近在玩 _通过前端_调用GRPC。通过前端调用GRPC业界有两种方式: GRPC Web和 GRPC JSON转码。 GRPC Web 通过…

    技术杂谈 2023年7月23日
    090
  • 《方法论学习 v0.8》出炉

    这两天耗费不少脑细胞,把以前的学习框架重新按照企业架构方法整理了一下,终于完成了这个版本,信息量还是比较大。 以下是过程中在朋友圈发出的一些截图,在这里汇总一下发出 Origina…

    技术杂谈 2023年5月30日
    093
  • cordov vue项目中调用手机原生api

    cordova不仅可以把vue项目打包成app,还可以让vue借助cordova调用手机原生的api 比如拍照 比如图片上传 比如定位 比如扫描二维码 比如支付等等 1、vue项目…

    技术杂谈 2023年5月30日
    077
  • 使用poi-tl导出word文件的几个技巧

    1、前言 Poi-tl提供了基于word模板文件导出word文件的功能。文档地址:http://deepoove.com/poi-tl/。 用下来,总体感觉还是很方便的。但使用过程…

    技术杂谈 2023年6月21日
    0137
  • WIN10平板如何打开文件夹选项

    打开计算机,然后查看,最后可以找到选项 本文为博主原创文章,未经博主允许不得转载。 posted @2018-08-18 15:38 gary_tao 阅读(364 ) 评论() …

    技术杂谈 2023年5月31日
    0116
  • Uniscribe文字自动换行

    我们获得了每个字形的宽度数组piAdvances,以及这个RUN所占用的总宽度abc。 piVdvances对应于每个字符,它取得了每个字形所占用宽度。 如果我们以行为单位来绘制文…

    技术杂谈 2023年5月31日
    069
  • Python数据分析–Numpy常用函数介绍(4)–Numpy中的线性关系和数据修剪压缩

    摘要:总结股票均线计算原理–线性关系,也是以后大数据处理的基础之一,NumPy的 linalg 包是专门用于线性代数计算的。作一个假设,就是一个价格可以根据N个之前的价…

    技术杂谈 2023年7月25日
    0122
  • JAVA基本类型和包装类型

    JAVA基本类型和包装类型 前言 Java语言中的数据类型分为基本数据类型和引用类型,而我们进行Java开发的时候都听说过基本数据类型和包装类型,今天我们就来详细聊一聊Java中的…

    技术杂谈 2023年6月21日
    095
  • 004 Linux 揭开神器 vim 面纱

    01 开篇初识 vim vim 功能吊炸天,但我们掌握一些常用的命令即可应对日常的使用了,不记流水账! Linux 中最常用的编辑器是什么? vim ! vi 跟 vim 啥区别?…

    技术杂谈 2023年7月10日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球