v2panda的技术专题不明觉厉iOS平时生活和工作中的iOS

Quartz2D 编程指南(一)概览、图形上下文、路径、颜色与颜

2016-05-13  本文已影响6518人  xuyafei86
  1. 概览
  2. 图形上下文
  3. 路径
  4. 颜色与颜色空间
  5. 变换
  6. 图案
  7. 阴影
  8. 渐变
  9. 透明层
  10. Quartz 2D 中的数据管理
  11. 位图与图像遮罩
  12. CoreGraphics 绘制 Layer

0.说明

本篇博客主要是对官方文档的总结与补充。翻译部分参考了南峰子的博客。你可以在参考资料中查看。

1.概览

简介

Page

Graphics Context

数据类型

  1. CGPathRef:用于向量图,可创建路径,并进行填充或描画(stroke)
  2. CGImageRef:用于表示bitmap图像和基于采样数据的bitmap图像遮罩
  3. CGLayerRef:用于表示可用于重复绘制(如背景)和幕后 (offscreen)绘制的绘画层
  4. CGPatternRef:用于重绘图
  5. CGShadingRef、CGGradientRef:用于绘制渐变
  6. CGFunctionRef:用于定义回调函数,该函数包含一个随机的浮点值参数。当为阴影创建渐变时使用该类型
  7. CGColorRef, CGColorSpaceRef:用于告诉Quartz如何解释颜色
  8. CGImageSourceRef,CGImageDestinationRef:用于在Quartz中移入移出数据
  9. CGFontRef:用于绘制文本
  10. *CGPDFDictionaryRef, CGPDFObjectRef, CGPDFPageRef, CGPDFStream, CGPDFStringRef, and CGPDFArrayRef:用于访问PDF的元数据
  11. *CGPDFScannerRef, CGPDFContentStreamRef:用于解析PDF元数据
  12. *CGPSConverterRef:用于将PostScript转化成PDF。在iOS中不能使用。

图形状态

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextRestoreGState(context);

坐标系统

内存管理

2.图形上下文

简介

创建 Window Graphics Context

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1, 0, 0, 1);
CGContextFillRect(context, CGRectMake (0, 0, 200, 100));
CGContextSetRGBFillColor(context, 0, 0, 1, .5);
CGContextFillRect(context, CGRectMake (0, 0, 100, 200));

*创建 PDF Graphics Context

创建 Bitmap Graphics Context

UIGraphicsBeginImageContext([UIScreen mainScreen].bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1, 0, 0, 1);
CGContextFillRect(context, CGRectMake (0, 0, 200, 100));
CGContextSetRGBFillColor(context, 0, 0, 1, .5);
CGContextFillRect(context, CGRectMake (0, 0, 100, 200));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();//CGBitmapContextCreateImage(context)
UIGraphicsEndImageContext();

像素格式

  1. Null 8 bpp, 8 bpc, kCGImageAlphaOnly
  2. Gray 8 bpp, 8 bpc, kCGImageAlphaNone
  3. Gray 8 bpp, 8 bpc, kCGImageAlphaOnly
  4. RGB 16 bpp, 5 bpc, kCGImageAlphaNoneSkipFirst
  5. RGB 32 bpp, 8 bpc, kCGImageAlphaNoneSkipFirst
  6. RGB 32 bpp, 8 bpc, kCGImageAlphaNoneSkipLast
  7. RGB 32 bpp, 8 bpc, kCGImageAlphaPremultipliedFirst
  8. RGB 32 bpp, 8 bpc, kCGImageAlphaPremultipliedLast

抗锯齿

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(context, YES);
CGContextSetAllowsAntialiasing(context, YES);

3.路径

简介

直线

曲线

闭合路径

椭圆

矩形

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 200, 200);

CGPoint point2 = CGPointMake(200, 200);
CGPoint point3 = CGPointMake(200, 400);
CGPoint point4 = CGPointMake(0, 200);
CGPoint points[3] = {point2, point3, point4};
CGContextAddLines(context, points, 3); // reset start point

CGContextAddArc(context, 200, 200, 100, 0, M_PI_2, 0);
CGContextAddArcToPoint(context, 200, 400, 400, 400, 100);

CGContextAddCurveToPoint(context, 100, 400, 200, 300, 100, 200);
CGContextAddQuadCurveToPoint(context, 0, 100, 200, 100);

CGContextClosePath(context);

CGContextAddEllipseInRect(context, CGRectMake(0, 0, 100, 200));
CGContextAddRect(context, CGRectMake(200, 400, 100, 200));

CGContextDrawPath(context, kCGPathStroke);

创建路径

  1. CGPathCreateMutable 取代 CGContextBeginPath
  2. CGPathMoveToPoint 取代 CGContextMoveToPoint
  3. CGPathAddLineToPoint 取代 CGContexAddLineToPoint
  4. CGPathAddCurveToPoint 取代 CGContexAddCurveToPoint
  5. CGPathAddEllipseInRect 取代 CGContexAddEllipseInRect
  6. CGPathAddArc 取代 CGContexAddArc
  7. CGPathAddRect 取代 CGContexAddRect
  8. CGPathCloseSubpath 取代 CGContexClosePath

填充规则

绘制路径

描边路径

CGContextStrokeRect(context, CGRectMake(200, 400, 100, 200));
CGContextStrokeRectWithWidth(context, CGRectMake(200, 400, 100, 200), 2);
CGContextStrokeEllipseInRect(context, CGRectMake(200, 400, 100, 200));
CGPoint point2 = CGPointMake(200, 200);
CGPoint point3 = CGPointMake(200, 400);
CGPoint point4 = CGPointMake(100, 300);
CGPoint point5 = CGPointMake(300, 300);
CGPoint points[4] = {point2, point3, point4, point5};
CGContextStrokeLineSegments(context, points, 4);

填充路径

CGContextFillRect(context, CGRectMake(100, 100, 100, 200));
CGRect rects[2] = {CGRectMake(100, 100, 100, 200), CGRectMake(200, 300, 100, 200)};
CGContextFillRects(context, rects, 2);
CGContextFillEllipseInRect(context, CGRectMake(100, 100, 100, 200));

混合模式

  1. kCGBlendModeNormal 正常
  2. kCGBlendModeMultiply 正片叠底
  3. kCGBlendModeScreen 滤色(屏幕)
  4. kCGBlendModeOverlay 叠加
  5. kCGBlendModeDarken 变暗
  6. kCGBlendModeLighten 变亮
  7. kCGBlendModeColorDodge 颜色减淡
  8. kCGBlendModeColorBurn 颜色加深
  9. kCGBlendModeSoftLight 柔光
  10. kCGBlendModeHardLight 强光
  11. kCGBlendModeDifference 差值
  12. kCGBlendModeExclusion 排除
  13. kCGBlendModeHue 色相
  14. kCGBlendModeSaturation 饱和度
  15. kCGBlendModeColor 颜色
  16. kCGBlendModeLuminosity 明度
  1. 原图


  2. 正片叠底


  3. 滤色


颜色与颜色空间

简介

透明度

创建设备依赖颜色空间

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextSetFillColorSpace(context, colorSpace);
CGContextSetStrokeColorSpace(context, colorSpace);
//Device RGB. 
CGContextSetRGBStrokeColor(context, 1, 0, 0, 1);
CGContextSetRGBFillColor(context, 1, 0, 0, 1);
//Device CMYK. 
CGContextSetCMYKStrokeColor(context, 1, 0, 0, 0, 1);
CGContextSetCMYKFillColor(context, 1, 0, 0, 0, 1);
//Device Gray.
CGContextSetGrayStrokeColor(context, 0.5, 1);
CGContextSetGrayFillColor(context, 0.5, 1);
//Any color space; you supply a CGColor object that specifies the color space. Use these functions for colors you need repeatedly.
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat colors[4] = {1.0, 0.0, 0.0, 1.0};
CGColorRef color = CGColorCreate(colorSpace, colors);
CGContextSetStrokeColorWithColor(context, color);
CGContextSetFillColorWithColor(context, color);
//The current color space. Not recommended. Instead, set color using a CGColor object and the functions CGContextSetStrokeColorWithColor and CGContextSetFillColorWithColor.
CGContextSetStrokeColor(context, colors);
CGContextSetFillColor(context, colors);

设置和创建颜色

CGContextSetFillColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor));

设置再现意图(Rending Intent)

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

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

博客:xuyafei.cn
简书:jianshu.com/users/2555924d8c6e
微博:weibo.com/xuyafei86
Github:github.com/xiaofei86

参考资料

上一篇下一篇

猜你喜欢

热点阅读