Inkscape 原位缩放工具-SVGScaler.py使用手册
Inkscape 原位缩放工具使用手册
1. 简介
通常在 Inkscape 中,如果你全选多个对象进行缩放,它们会相对于整个选区的中心缩放,导致位置发生偏移。本工具通过 Python 脚本计算每个对象的几何中心,逐个应用缩放变换,从而实现“变大变小,位置不动”的效果。
主要特性:
- 支持多种对象: 路径 (Path)、矩形、圆形、普通文本、流式文本 (FlowRoot)、图片等。
- 智能图层识别: 可指定处理特定图层(如只缩放 "text" 层)。
- 灵活的缩放系数: 支持放大倍数和倒数缩小(如输入 -2 代表缩小到 1/2)。
2. 环境准备
- 安装 Python: 确保电脑上安装了 Python 3.x 版本。
- 下载脚本: 下载地址
3. Inkscape 文件准备流程 (重要)
为了让脚本准确找到需要缩放的内容,建议在 Inkscape 中遵循以下操作规范:
步骤 A:整理图层
脚本默认处理名为 text 的图层。建议将需要调整大小的对象归类到一个专门的图层中。
- 打开 Inkscape (
Ctrl+Shift+L打开图层面板)。 - 新建一个图层,命名为
text(或者其他你喜欢的名字,运行时需指定)。 - 选中需要缩放的对象,右键点击 -> 移动到图层 -> 选择
text图层。
步骤 B:群组逻辑 (关键)
脚本是逐个处理图层下的直接子对象的。
- 如果不群组: 图层里的每个独立元素(如每个字母、每根线条)都会以各自的中心单独缩放。
- 如果群组 (
Ctrl+G): 脚本会将整个群组视为一个对象,以群组的几何中心进行整体缩放。
场景举例:
如果你有一个“圆圈”和一个“数字”组成一个标号。
- 错误做法: 圆圈和数字分散在图层里。 -> 结果:圆圈变大了,数字变大了,但它们可能会轻微错位。
- 正确做法: 选中圆圈和数字,按下
Ctrl+G编组。 -> 结果:整个标号以整体中心原位放大。
步骤 C:保存文件
将文件保存为 Inkscape SVG 或 普通 SVG 格式(例如 drawing.svg)。
4. 脚本运行方法
打开终端 (Command Prompt / Terminal),进入脚本所在的目录。
基本语法
python scale_svg.py [输入文件] [缩放系数] [输出文件(可选)] [参数]
参数详解
| 参数位置/名称 | 说明 |
|---|---|
| 输入文件 | SVG 文件的完整路径 (例如 input.svg)。 |
| 缩放系数 | 正数 (>0): 直接放大倍数。如 1.5 (放大1.5倍), 0.8 (缩小到80%)。负数 (<0): 倒数缩小模式。如 -2 等同于 0.5 (缩小一半),-4 等同于 0.25。 |
| 输出文件 | (可选) 处理后的保存路径。如果不填,默认保存为 原文件名_系数.svg。 |
--layer |
指定要处理的图层名称。默认为 text。 |
-a / --all |
全局模式。忽略图层名称,处理 SVG 根目录下的所有顶层群组。 |
5. 使用案例
案例 1:将 "text" 图层中的内容放大 1.5 倍
这是最常用的场景。假设文件名为 map.svg。
python scale_svg.py map.svg 1.5
结果:生成 map_1.5.svg,其中 text 图层的对象原位放大了 50%。
案例 2:将 "labels" 图层的内容缩小一半
使用了负数参数技巧(-2 表示 1/2)。指定了 --layer 参数。
python scale_svg.py drawing.svg -2 --layer labels
结果:生成 drawing_-2.0.svg,labels 图层的内容尺寸减半。
案例 3:指定输出文件名
python scale_svg.py icon.svg 2.0 output_icon.svg
结果:生成 output_icon.svg。
案例 4:暴力处理所有图层
如果你想把整个文件里的所有顶层对象都分别原位缩放(慎用,可能会打乱布局)。
python scale_svg.py schematic.svg 0.9 --all
6. 常见问题排错 (Troubleshooting)
Q1: 运行后提示 "未找到可处理对象"?
- 检查图层名称: 确认 Inkscape 中的图层名称是否与命令行
--layer参数一致(区分大小写,默认为 "text")。 - 检查图层结构: 对象必须直接位于该图层(组)下,不能深埋在多个嵌套的组里(脚本目前主要扫描图层的直接子节点)。
Q2: 缩放后,文字跑偏了?
- 脚本通过计算 Bounding Box (包围盒) 的中心来进行变换。如果文字对象的对齐方式或坐标原点比较特殊,可能会有轻微视觉偏差。通常情况下,将文字转换为路径 (
Path) 再缩放是最稳妥的,但本脚本已针对 Text 做了优化,通常无需转换。
Q3: 原文件被覆盖了吗?
- 默认不会。脚本会生成新文件。如果你手动指定输出文件名为原文件名,脚本会询问
是否覆盖? (y/N)。
Q4: 支持 Inkscape 的流式文本 (FlowRoot) 吗?
- 支持。 脚本包含了解析
flowRegion的逻辑,可以正确计算流式文本框的中心并进行缩放。
7. 原理简述 (供高级用户参考)
该脚本的工作流程如下:
- 解析 XML: 使用 Python
xml.etree读取 SVG。 - 定位图层: 查找带有
inkscape:label="layer_name"属性的<g>标签。 - 计算包围盒 (BBox): 递归解析路径 (
d属性)、形状属性 (x, y, width, height) 以及变换矩阵 (transform),计算出对象的几何中心 $(C_x, C_y)$。 - 应用变换: 在对象现有的
transform属性后追加矩阵运算:
$$ \text{translate}(C_x, C_y) \cdot \text{scale}(S) \cdot \text{translate}(-C_x, -C_y) $$
这确保了缩放是相对于对象自身中心进行的。