Color Trace 是一款将位图描摹为彩色矢量 svg 图片的程序,是一个命令行工具,使用 Python 脚本实现,运行环境 Python3.8+。@Appinn

Color Trace - 位图转彩色矢量 SVG 图片

来自发现频道。

Color Trace

这是一个开源项目,它的原理是:

  • 先将位图图片的颜色缩减,以 png 为中转格式
  • 将图片按颜色分层
  • 将每一层颜色使用 Potrace 生成矢量 svg 图片
  • 最后将所有颜色的 svg 图片合成为一张彩色的 svg 图片

使用简单,但是配置环境比较复杂,它依赖:

  • ImageMagick,用于转换图像格式
  • Potrace,用于将位图转换为单一颜色矢量图
  • pngquant,用于缩减颜色(Median-Cut 算法,这是默认使用的算法)
  • pngnq,用于缩减颜色(NeuQuant 算法)

所以青小蛙觉得,就转一下开发者的背景介绍吧,真要使用的请移步发现频道。

效果对比

原图:

Color Trace - 位图描摹转彩色矢量 SVG 图片 1
以一个字帖图片为例,这是 png 格式的位图(370KB)
Color Trace - 位图描摹转彩色矢量 SVG 图片 2
颜色数为 3 的 svg 转换结果(190KB):

背景

我希望将手上的一些扫描版的 PDF 书籍转为矢量格式保存,借助矢量图形的优点,如果使用适当的参数,可以得到更观看体验更好、体积更小的电子书。于是发现了 Potrace,转换的效果非常好,许多程序、项目都在使用它和它的代码,唯一的遗憾是它只支持黑白。

Potrace™ 是一种用于描摹位图的工具,即将位图转换为平滑、可缩放的图像。输入是位图(PBM、PGM、PPM 或 BMP 格式),输出是几种矢量文件格式之一。

典型用途是从扫描的数据(例如公司或大学徽标、手写笔记等)创建 SVG 或 PDF 文件。生成的图像是平滑的,可以以任何分辨率呈现。

Potrace 目前可以生成以下输出格式:SVG、PDF、EPS、PostScript、DXF、GeoJSON、PGM、Gimppath 和 XFig。

然后我也试用了 Adobe illustrator、Inkscape 的描摹功能,但都需要图形界面一张一张操作,不能批量化操作,不如 Potrace。

毕竟发现了 Potrace 这样一个古老、优秀、应用广泛的软件,然后我就在 Github 上搜索,看看有没有人用 Python 和 Potrace 结合,做出有意思的东西。

结果,还真就找到这样一个 star 几十的 repo:由 customink 在 2012 年用 Python3.2 实现的 color_trace !

看了 readme 后,怀着激动的心下载了源码,试运行,结果报错。毕竟是 2012 年用 Python3.2 写的,太古老了,Python 的许多内置函数都变了不少。

想要用的话,就只能自己修了。英文源码我是看不下去,就把里面的大部分注释和变量都替换成了方便我理解的中文翻译,这样才逐渐理解了这个程序的原理,然后进行测试、修复、优化,最终可用了。Happy!


另外,@heyeshuang 给我推荐了 vtracer,我一看,居然挺成熟的,我的程序该不会白造轮子了吧,然后一看,我去,我居然还 star 过,怎么就没想起来?

然后我试用了一下,用上面那张 png 图片,vtracer 得到了这样的结果(427KB):

vtracer矢量,默认

调节颜色不能调整数量,只能调整位深,如果是低位深,则效果要更差些(349KB):

Color Trace - 位图描摹转彩色矢量 SVG 图片 3

在这张字帖示例图的转换结果对比下,无疑是我的 potrace 方案效果更好。其它图我还没比较。不过 vtracer 的速度确实很快,在一些场景下应该效果会不错。

最后效果说明,我做这个轮子还是有意义的。

相关链接

  • 发现:https://meta.appinn.net/t/topic/25126
  • Gitee:https://gitee.com/haujet/color-trace
  • GitHub:https://github.com/HaujetZhao/color-trace