vectorkit 图片转矢量
开发者

批量交付走命令行

一条命令扫整个文件夹,每张图转出彩色矢量和黑白线稿两版 SVG,直接写进输出目录。
单张图出错只记进失败清单,整批照跑,跑完打印汇总。

命令行和网页用的是同一条管线,网页上调好的效果,批量跑出来是一致的。

快速开始 输出说明
一条命令 vectorkit run -i 输入/ -o 输出/
两版产物 每张图出彩色 SVG + 线稿 SVG,可选预览 PNG
出错隔离 坏文件跳过并记进清单,不中断整批
安装

装到本机

需要 Python 3.9 以上。装完得到 vectorkit 命令。

# 拉代码
git clone <仓库地址> && cd vectorkit

# macOS 自带的 pip 21.2 装不了本项目,先升级(需要 21.3 以上)
python3 -m pip install --upgrade pip
pip install -e ".[dev]"

两个系统依赖

# macOS 用 Homebrew
brew install potrace    # 黑墨线矢量化
brew install inkscape   # 预览渲染、PDF / EPS / PNG 导出

两个都不是硬依赖,缺了会自动降级:没有 potrace,黑墨线的质量打折;没有 Inkscape, 预览 PNG 生成不出来(会单独报一行,SVG 本身照写),把配置里的 output.preview 关掉即可。

快速开始

一条命令跑完整个文件夹

# 把 输入/ 里的图批量转成 输出/ 下的彩色 + 线稿 SVG
vectorkit run -i 输入/ -o 输出/

# 用自己的配置
cp config.example.yaml config.yaml
vectorkit run -i 输入/ -o 输出/ -c config.yaml

# 只出彩色,并且忽略已有产物重跑一遍
vectorkit run -i 输入/ -o 输出/ --no-lineart --force

参数

参数说明
-i, --input 输入图片目录,必填。只扫这一层,不进子目录。
-o, --output 输出目录,必填。目录不存在会自动创建。
-c, --config YAML 配置文件路径。不给就全部走默认值。
--force 忽略已有产物,强制重新生成。
--no-lineart 关掉线稿管线,只出彩色版。

产物

认的输入扩展名是 .png .jpg .jpeg .webp .bmp,其余文件直接不看。每张图按原文件名出两版:

输入/张三.png
  → 输出/张三_彩色.svg
  → 输出/张三_线稿.svg
  → 输出/张三_彩色_预览.png      # output.preview: true 时才出
  → 输出/张三_线稿_预览.png
配置文件

画质旋钮都在 YAML 里

复制 config.example.yaml 改就行,不用动代码。整段 pipeline 可以省掉,省了就是下表的默认值。接单时一套配置存成某个客户的预设复用。

color:
  enabled: true             # 出彩色版

lineart:
  enabled: true             # 出线稿版
  backend: xdog             # xdog=统一管线线稿(默认) | ai=AI 线稿(需自装 torch)

pipeline:
  color_threshold: 50
  stroke_width: 2.0
  filter_speckle: 16
  ink_thr: 85
  # palette_k: 12           # 留空=自适应取色
  depixelate: auto

output:
  preview: true             # 出预览 PNG(需系统 Inkscape)
配置项 默认值 作用
color.enabled true 出彩色版。设 false 就只出线稿。
lineart.enabled true 出线稿版。等同于命令行的 --no-lineart 取反。
lineart.backend xdog 线稿后端。xdog 走统一管线,纯 CPU,无额外依赖; ai 走 informative-drawings,需要自己装 torch,缺了会报错。
lineart.ai_style style2 AI 后端风格,style1style2;只在 backend: ai 时生效。
pipeline.color_threshold 50 区域分割的色差门槛,越小分得越碎。
pipeline.stroke_width 2.0 线稿描边宽度,单位是基准宽 1440px 下的像素。必须为正数。
pipeline.filter_speckle 16 删碎斑力度,越大越干净,但太大容易把小件一起删掉。
pipeline.ink_thr 85 黑墨灰度阈值,取值 0~255,越大收进来的墨越多。
pipeline.palette_k 留空 色数档,取值 2~64,等同网页上的「色数」档;留空就是自适应取色 (网页上的「自动」)。
pipeline.depixelate auto 马赛克平滑。auto 只处理检测到的低清放大方块,正常图零影响; on 强制平滑;off 关闭,保留像素画风格。
output.preview true 顺带渲染预览 PNG(彩色、线稿各一张),需要系统装了 Inkscape。

数值越界(比如 palette_k: 1)直接报错退出,不会静默钳位——钳位会让调参结果对不上账。 另外 YAML 会把 on / off 当成布尔值,depixelate 这里已经做了兼容,写哪种都行。旧管线留下的旋钮(transparent_bgcolor_precisionline_strength 等)对统一管线不生效, 写在配置里也不报错,只是被忽略。

批量交付

跑起来是什么样

每张图的结果逐行打出来,最后一行是汇总。有失败的会单列清单,方便挑出来重跑。

$ vectorkit run -i 输入/ -o 输出/
  ✓ 彩色: 张三_彩色.svg
  ✓ 线稿: 张三_线稿.svg
    预览: 张三_彩色_预览.png
    预览: 张三_线稿_预览.png
  跳过(已存在): 李四.png
  失败: 王五.png — 图片读取失败(文件损坏或格式不支持): 输入/王五.png

成功: 1  跳过: 1  失败: 1
失败文件清单:
  - 王五.png

出错隔离

单张图读不出来,只记进失败清单,后面的照跑。彩色和线稿两条管线各报各的错, 一边挂了另一边照出。预览渲染失败也不算整图失败,SVG 已经写盘了。

幂等可续跑

输出目录里已有的 SVG 默认跳过,所以中途断了直接重跑同一条命令就行, 不会重算已完成的图。想全部重来加 --force

汇总可核对

跑完打印成功 / 跳过 / 失败三个数和失败文件名,交付前拿这行对账, 不用自己数文件夹。

在 Python 里直接调

引擎是纯函数,可以自己接

core/ 下的模块不依赖 click 和 Flask,内存进、SVG 字符串出, 要嵌进自己的流程就直接 import。

import cv2
from vectorkit.core.region_lineart import vectorize_outline_fill

bgr = cv2.imread("输入/张三.png")
line_svg, color_svg, _q = vectorize_outline_fill(bgr, palette_k=12)

要整个批处理流程也可以:vectorkit.cli.run(输入目录, 输出目录, cfg) 负责扫盘、写盘、渲染预览,返回一个带成功数、跳过数、失败文件清单的字典。

导出格式

交付格式

命令行写出的是 SVG,开着 output.preview 再附一张预览 PNG。 需要下面这些格式交付时,目前在网页端每张结果卡的下拉里导出,可以填物理尺寸(mm)。

各格式分别适合什么场景、尺寸怎么填,见说明页

HTTP API
规划中

暂时没有

现在没有 HTTP API,也没有 SDK,这页写的命令行和上面那段 import 就是全部的程序化入口。 主要卡在算力:一张图要占满一颗 CPU 一到两分钟,对外开接口得先把排队和配额做扎实, 不然只能靠限速或者降质撑住。

在此之前,要接进自己的系统,建议在自己的机器上跑命令行,或者直接调 core/ 里的函数。