如何从文件创建 CGPath - 即 SVG

Posted

技术标签:

【中文标题】如何从文件创建 CGPath - 即 SVG【英文标题】:How to create a CGPath from a file — i.e. SVG 【发布时间】:2010-08-23 15:36:58 【问题描述】:

是否可以从给定文件创建 CGPath?

SVG 是首选,但任何东西都可以。

【问题讨论】:

【参考方案1】:

PocketSVG 会将 SVG 文件转换为 UIBezierPath,您可以从中获取 CGPath:

PocketSVG *myBezier = [[PocketSVG alloc] initFromSVGFileNamed:@"BezierCurve1-iPad"];    
UIBezierPath *myPath = myBezier.bezier;
//myPath.CGPath <--- your CGPath

【讨论】:

【参考方案2】:

我也在这个问题上苦苦挣扎,在网上搜索解决方案。 SVGKit 似乎是我能找到的最接近的解决方案,但仍然没有完成这项工作。我遇到的问题是它似乎只支持某些 SVG 文件,而且我无法将我的任何文件转换为兼容格式。我什至写了自己的解析器,但结果也不一致。

我开始更深入地研究 SVG 规范,每个矢量编辑工具生成这些文件的方式似乎存在一些不一致之处。然后我最终研究了基于 SVG 的 Adob​​e FXG 格式。我立即注意到的一件事是路径数据中的命令都是绝对的而不是相对的。到目前为止,这(恕我直言)使 FXG 优于 SVG。

我能够将其转换为实际上完美运行的 CGPath。我目前只需要转换路径数据以用作剪切路径,但完全有可能支持完整的 FXG 规范。

这是我拼凑的一个小 AIR 应用程序,用于从 FXG 路径数据生成核心图形命令,它展示了潜力。 http://iksnae.com/fxgtool/

希望对你也有帮助。

【讨论】:

【参考方案3】:

[更新:在我第一次回答这个问题之后的几年里,我发布了一个在 MIT 许可下处理这个问题的类:SVGgh SVGPathGenerator。寻找:

+(CGPathRef) newCGPathFromSVGPath:(NSString*)anSVGPath whileApplyingTransform:(CGAffineTransform)aTransform

]

我今天正在考虑这样做,除了绝对和相对弧操作数之外的所有操作数都非常巧妙地映射到 CGMutablePathRef 的路径创建 API。当我遇到这个问题时,我正在谷歌搜索以找到使弧的 SVG 定义与 CGPathAddArcToPoint 兼容所需的数学巫术。您只需解析 SVG 路径元素的 d 属性,您可以通过 NSXMLParser 对象和您提供的委托来获取该属性。

如果您可以使用 GPL 的代码,而我不能,那么 Webkit 源有一个文件 SVGPathParser.cpp,其中包含一些有用的花絮。 W3C 有一些有用的implementation notes,Gabe Lerner 用 Ja​​vaScript 实现了它。

【讨论】:

【参考方案4】:

好像还有更聪明的解决方案SVGKit:

SVGKit 是一个 Cocoa 框架,用于将 SVG 文件渲染为核心动画层。所有形状都由 CAShapeLayer 类的实例表示,并且在设计上是可动画的。 SVGKit 与最新的 Mac OS X 和 ios SDK 兼容。

【讨论】:

很好,但目前不支持浮点。有一个使用 NSScanner 的拉取请求。那确实在路径上做浮点数。【参考方案5】:

是的。有可能的。我还没有这样做,但是因为SVG uses paths itself,似乎将 SVG 路径映射到 CGPath 是可能/可管理的。那时的问题变成了你有多大的动力?在粗略的谷歌搜索中,我没有看到任何已经这样做的 Objective-C 库,但它可能就在那里。我确实看到了a Java implementation,你可能可以移植。

考虑到网络上缺乏明显的解决方案,我猜这对于应用程序开发人员来说并不是一个非常普遍的需求。可能有更好/更简单的方法来解决手头的问题。如果您只想显示 SVG 图像,您可以嵌入 webview 并让 WebKit 为您呈现。

【讨论】:

我不想只显示 svg。在某些视图中,我需要相当复杂的路径。并且我希望用户能够更改此路径,如果他们可以在他们最喜欢的矢量程序中绘制它们,那就太好了。 这是有道理的。不幸的是,看起来没有任何 Objective-C 实现。我见过一些 C++ 库,但它们看起来相当庞大并且很难移植。支持完整的 SVG 规范可能是可行的,但很耗时。祝你好运。

以上是关于如何从文件创建 CGPath - 即 SVG的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个随机封闭平滑CGPath?

如何从 PowerPoint 文件文件创建一组图像文件?

iOS 10 上的 UIVisualEffectView 蒙版

Android 地图:如何使用 SVG 文件自定义标记图标?

从 div 到 div 绘制弯曲的 SVG 箭头线

ios:如何使用 CGPath 模糊图像?