«

Inkscape 原位缩放工具-SVGScaler.py使用手册

wangsy 发布于 阅读:62 linux


Inkscape 原位缩放工具使用手册

1. 简介

通常在 Inkscape 中,如果你全选多个对象进行缩放,它们会相对于整个选区的中心缩放,导致位置发生偏移。本工具通过 Python 脚本计算每个对象的几何中心,逐个应用缩放变换,从而实现“变大变小,位置不动”的效果。

主要特性:


2. 环境准备

  1. 安装 Python: 确保电脑上安装了 Python 3.x 版本。
  2. 下载脚本: 下载地址

3. Inkscape 文件准备流程 (重要)

为了让脚本准确找到需要缩放的内容,建议在 Inkscape 中遵循以下操作规范:

步骤 A:整理图层

脚本默认处理名为 text 的图层。建议将需要调整大小的对象归类到一个专门的图层中。

  1. 打开 Inkscape (Ctrl+Shift+L 打开图层面板)。
  2. 新建一个图层,命名为 text (或者其他你喜欢的名字,运行时需指定)。
  3. 选中需要缩放的对象,右键点击 -> 移动到图层 -> 选择 text 图层。

步骤 B:群组逻辑 (关键)

脚本是逐个处理图层下的直接子对象的。

场景举例:
如果你有一个“圆圈”和一个“数字”组成一个标号。

  • 错误做法: 圆圈和数字分散在图层里。 -> 结果:圆圈变大了,数字变大了,但它们可能会轻微错位。
  • 正确做法: 选中圆圈和数字,按下 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: 运行后提示 "未找到可处理对象"?

Q2: 缩放后,文字跑偏了?

Q3: 原文件被覆盖了吗?

Q4: 支持 Inkscape 的流式文本 (FlowRoot) 吗?


7. 原理简述 (供高级用户参考)

该脚本的工作流程如下:

  1. 解析 XML: 使用 Python xml.etree 读取 SVG。
  2. 定位图层: 查找带有 inkscape:label="layer_name" 属性的 <g> 标签。
  3. 计算包围盒 (BBox): 递归解析路径 (d 属性)、形状属性 (x, y, width, height) 以及变换矩阵 (transform),计算出对象的几何中心 $(C_x, C_y)$。
  4. 应用变换: 在对象现有的 transform 属性后追加矩阵运算:
    $$ \text{translate}(C_x, C_y) \cdot \text{scale}(S) \cdot \text{translate}(-C_x, -C_y) $$
    这确保了缩放是相对于对象自身中心进行的。

请先 登录 再评论