我正在寻找一种自动将矢量文件 (.svg) 转换为 .dst 刺绣文件的解决方案。我一直在研究 pyembroidery,并且在我开始尝试之前想知道这是否可能。这些文件只是开始保持简单的文本。
1 回答
Bonafides:pyembroidery 的作者,svgelements 的作者。
是和不是。是的,您可以获取普通矢量文件并将矢量方向轻松转换为刺绣。所以你得到了一个 svg 路径,你可以把这个笔画变成一个 dst。你只需几行就可以做到这一点。以下是这些行:
import glob
from pyembroidery import *
from svgelements import *
for svg_file in glob.glob("*.svg"):
pattern = EmbPattern()
for element in SVG.parse(svg_file, transform="scale(%f)" % (254.0 / 96.0)):
if isinstance(element, Shape):
element = Path(element)
if isinstance(element, Path):
for subpath in element.as_subpaths():
subpath = Path(subpath)
distance = subpath.length(error=1e7, min_depth=4)
segments = int(distance / 20.0)
points = [subpath.point(i / float(segments)) for i in range(int(segments)+1)]
points = [(p.x, p.y) for p in points]
pattern.add_block(points, subpath.stroke)
PyEmbroidery.write(pattern, svg_file + ".dst")
这将加载当前目录中的所有 svg 文件并将它们转换为 dst 文件。svg 库是我也在 pypi 上编写的另一个项目。它可能是 python 上最好的 svg 代码。有些速记与 svg.path 有点相关,有些可能看起来有点神奇,但该库允许通过 svg 转换字符串进行乘法运算。(254.0 / 96.0) 位是因为在现代 svgs 中,原生路径单位通常为每英寸 96 像素,而 dst 文件的原生分辨率为每单位 0.1 毫米。所以那里的变换使单位完全相等。
现在是答案的“否”部分。填充转换实际上有点困难。有两种算法来执行主要的洪水填充,最难的一种是 tatsumi,它需要对合并和拆分节点进行大量调整,并将形状绘制成可扫描的几何图形和一些额外的东西,这有点麻烦。更简单的是欧拉填充,它需要将填充的形状变成欧拉图并删除一些边缘。它实际上在可执行代码的范围内。它是 InkStitch 的基础代码,InkStitch 是当今主要的 inkscape 插件刺绣程序。在我被作者永久禁止建设性批评之前,这是编写 pyembroidery 作为后端 I/O 的东西。
如果你只想要笔画。完毕。拿去银行。如果你想要填充,数学变得比简单的刺绣/IO模块更难为你做。