2

我在 Cocoa 中有包含 Quartz-2D 引用(描述颜色、填充图案、渐变和阴影)的对象。我想NSCoding在我的对象中实现协议,因此需要序列化那些不透明的 Quartz-2D 结构。

可能的解决方案可能是:

  • 在我的对象中定义一组属性,允许在需要时从头开始设置数据结构。然后可以轻松地对它们进行序列化。示例:为红色、绿色、蓝色和 alpha 存储四个浮点数,然后使用CGColorCreate. 缺点:信息重复,因此存在潜在的一致性和(到目前为止较小的)空间消耗问题。我需要手动编写属性设置器,以便在组件更改时重新创建 Quartz 结构。那会使我的代码大大膨胀。

  • 使用 Quartz 函数读出属性。示例:用于CGColorGetComponents颜色。缺点:它似乎适用于颜色。但是其他结构没有等效的功能,所以我看不出这如何适用于渐变、阴影、阴影等。

  • 直接从原始的不透明结构中读出属性。缺点:正如文档所说,这些结构应该是不透明的。因此,如果引擎盖下发生某些变化,我的代码将会中断。CGColorGetComponents(如果应该这样做,Apple 肯定不会提供这样的功能。)此外,像CGFunctionRefinside aCGShadingRef这样的东西真的会自找麻烦。

序列化 Quartz 结构的最佳实践是什么?

4

1 回答 1

6

答案从一类到另一类几乎不同:

  • CGImage:使用 CGImageDestination 制作一个 TIFF 文件。(相当于 NSImage 的TIFFRepresentation方法。)
  • CGPath:编写一个应用程序函数,您可以使用它来描述路径的元素,例如 PostScript 代码。写一个简单的解释器去另一个方向。
  • CGColorSpace:您可以导出 ICC 表示。
  • CGColor:正如你所描述的,但不要忘记包括色彩空间。
  • CGLayer:卷积:制作位图上下文,将图层绘制到其中,然后转储上下文的图像,然后将其序列化。
  • CGFont:这个名字对于大多数应用程序来说应该足够了。如果你真的很喜欢(即,使用变体功能),你会想要包含字体的变体字典。您必须单独维护您对字体大小的了解,因为 CGFont 没有字体大小,而 CGContext 不允许您获取您在其中设置的字体大小。
  • CGPDFDocument:快速浏览一下,CGPDFObjects 似乎都是不可变的,因此您只需归档原始 PDF 数据或从中获取的 URL。
  • CGGradient、CGPattern、CGShading 和大多数其他类:是的,你搞砸了。您只需要单独维护创建对象时使用的所有信息。
于 2010-10-16T22:13:41.397 回答