#svg #plotter #plotters #converter #segment #image #command

app svg_path_simplifier

SVG路径简化器、转换器和自动裁剪器

1个不稳定版本

0.2.1 2023年1月18日

#759 in 图像

48 每月下载量

MIT 许可证

32KB
682

SVG Path Simplifier

svgps 程序将 .svg 图像转换为包含在 .svgcom 文件中的 MoveTo/LineTo/CubicBezierTo 命令。

最初的目标是为了使SVG对于绘图仪来说更加美观和简化。

它使用 usvg 进行SVG解析和简化,以及 kurbo 进行几何计算。

演示

XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX
原始SVG 已转换 已转换+自动裁剪
ferris ferris-gen ferris-cut
tiger tiger-gen tiger-cut

请参阅 demo/gen.sh

功能

  • .svg 生成 .svgcom
  • .svgcom 渲染为 .svg 以进行预览
  • 仅选择转换的描边路径
  • 自动裁剪因被其他图形覆盖而不可见的路径段(将其视为深度测试)

用法

svgps help generate # Try this first to see all the options
svgps generate INPUT.svg OUTPUT.svgcom [OPTIONS...]
svgps render INPUT.svgcom OUTPUT.svg [OPTIONS...]

自动裁剪行为

-a (--autocut) 标志使程序裁剪输入SVG图像中包含的路径的覆盖段。

只有闭合填充路径才能覆盖其他路径。

SvgCom格式

SvgCom是一种用于矢量图形轮廓表示的文本格式,大量借鉴了SVG的 <path:d> 格式。

文件扩展名为 .svgcom

文件内容的形式为

<viewbox_width: uint32>
<SPACE>
<viewbox_height: uint32>
<SPACE>
<number_of_commands: uint32>
<SPACE>
<number_of_coordinates: uint32>
<EOL>

<command: "M" | "L" | "C">... (not delimited)
<EOL>

<coordinate: float64>... (delimited by <SPACE>)

[<EOL> <garbage: text>]

其中 <EOL><LF>,不是 <CR><LF>,而 <SPACE> 是一个 单个 ASCII 空格。

文件末尾的附加(垃圾)行是可选的,并且转换器永远不会读取这些行。

坐标列表指定了二维点的坐标,因此坐标的数量必须是偶数。

示例 0

示例.svgcom

720 480 2 4
ML
0 0 100 100

此文件定义了一个大小为 720x480 的图像,包含 2 个命令(Move 和 Line)和 4 个坐标(0.00.0100.0100.0),这两个坐标构成两个点。

示例 1

输入.svg

<?xml version="1.0" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 200">
    <!-- Z is converted to L -->
    <path stroke="#000000" fill="none" d="M 0 0 L 100 0 L 100 70 L 0 70 Z"/>
</svg>

输出.svgcom

250 200 5 10
MLLLL
0 0 100 0 100 70 0 70 0 0

示例 2

输入.svg

<?xml version="1.0" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600">
    <!-- Hidden elements are removed -->
    <path stroke="#000000" visibility="hidden" fill="none" d="M 0 0 L 100 0 L 100 70 L 0 70 Z"/>

    <!-- Groups are flattened -->
    <g>
        <!-- Transforms are resolved -->
        <g transform="translate(0 0)">
            <!-- All shapes are converted to paths -->
            <ellipse cx="100" cy="100" rx="50" ry="60"/>
        </g>
    </g>
</svg>

输出.svgcom

800 600 5 26
MCCCC
150 100 150 133.1370849898476 127.61423749153967 160 100 160 72.38576250846033 160 50.00000000000001 133.1370849898476 50 100.00000000000001 49.99999999999999 66.86291501015242 72.38576250846032 39.99999999999999 99.99999999999999 39.999999999999986 127.61423749153965 39.99999999999997 150 66.86291501015239 150 100

依赖项

~4.5MB
~91K SLoC