Python实现将位图描摹为彩色矢量 svg 图片的源代码,Python实现位图转彩色矢量代码

news/2025/1/11 14:43:14/

Color Trace

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

✨ 效果

以一个字帖图片为例,这是 png 格式的位图(370KB):

在这里插入图片描述

这是颜色数为 1 的 svg 转换结果,即只有黑色(32KB):

在这里插入图片描述

颜色数为 3 的 svg 转换结果(190KB):

在这里插入图片描述

📝 原理

它的原理是:

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

🔨 依赖

为了实现上述的功能,你需要先保证安装有:

  • ImageMagick,用于转换图像格式

  • Potrace,用于将位图转换为单一颜色矢量图

  • pngquant,用于缩减颜色(Median-Cut 算法,这是默认使用的算法)

  • pngnq,用于缩减颜色(NeuQuant 算法)

    pngnq 是可选安装,NeuQuant 算法可以生成更多颜色,如果你不去手动选择这个算法,就不需要安装 pngnq

    因为在 Windows 上安装 pngnq 还需要手动去下载 libpng13.dll,太麻烦。懒人就直接不用它了。

上述安装的意思是:将那些程序的可执行文件所在的目录添加到系统的环境变量。(如果不懂这句话的意思可以百度学习下,这个太基础,就不讲了)

Python 依赖下列库:

  • lxml

使用 pip 安装即可

👍 使用方式

本工具是 Python 脚本的形式,脚本文件在 src 文件夹中,在命令行中使用:

$ python color-trace.py -h
usage: color-trace.py [-h] -i src [src ...] [-o dest] [-d destdir] [-C N][--width <dim>] [--height <dim>] [-c N] [-q algorithm][-fs | -ri] [-r paletteimg] [-s] [-p size] [-D size][-S threshold] [-O tolerance] [-bg] [-v] [--version]使用 potrace 将位图转化为彩色 svg 矢量图optional arguments:-h, --help, /?        显示帮助-i src [src ...], --input src [src ...]输入文件,支持 * 和 ? 通配符-o dest, --output dest输出保存路径,支持 * 通配符-d destdir, --directory destdir输出保存的文件夹-C N, --cores N       多进程处理的进程数 (默认使用全部核心)--width <dim>         输出 svg 图像宽度,例如:6.5in、 15cm、100pt,默认单位是 inch--height <dim>        输出 svg 图像高度,例如:6.5in、 15cm、100pt,默认单位是 inch-c N, --colors N      [若未使用 -p 参数,则必须指定该参数] 表示在描摹前,先缩减到多少个颜色。最多 256个。0表示跳过缩减颜色 (除非你的图片已经缩减过颜色,否则不推荐0)。-q algorithm, --quantization algorithm颜色量化算法,即缩减颜色算法: mc, as, or nq. 'mc' (Median-Cut,中切,由pngquant 实现,产生较少的颜色,这是默认); 'as' (Adaptive SpatialSubdivision 自适应空间细分,由 ImageMagick 实现,产生的颜色更少); 'nq'(NeuQuant 神经量化, 可以生成更多的颜色,由 pnqng 实现)。 如果 --colors 0则不启用量化。-fs, --floydsteinberg启用 Floyd-Steinberg 拟色 (适用于所有量化算法或 -p/--palette).警告:任何米色算法都会显著的增加输出 svg 图片的大小和复杂度-ri, --riemersma      启用 Rimersa 拟色 (只适用于 as 量化算法或 -p/--palette)-r paletteimg, --remap paletteimg使用一个自定义调色板图像,用于颜色缩减 [覆盖 -c 和 -q 选项]-s, --stack           堆栈描摹 (若要更精确的输出,推荐用这个)-p size, --prescale size为得到更多的细节,在描摹前,先将图片进行缩放 (默认值: 1)。例如使用 2,描摹前先预放大两倍-D size, --despeckle size抑制斑点的大小(单位是像素) (默认值:2)-S threshold, --smoothcorners threshold转角平滑参数:0 表示不作平滑处理,1.334 是最大。(默认值:1.0-O tolerance, --optimizepaths tolerance贝塞尔曲线优化参数: 最小是0,最大是5(默认值:0.2)-bg, --background     将第一个颜色这背景色,并尽可能优化最终的 svg-v, --verbose         打印出运行时的细节--version             显示程序版本

例如:

$ python color-trace.py -i 位图.png -c 3 -o 矢量.svg
$ python color-trace.py -i 文件夹/*.png -c 3 -d 输出文件夹

🔮 背景

这个程序的初始代码

我希望将手上的一些扫描版的 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!


http://www.ppmy.cn/news/6930.html

相关文章

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法 本次和大家分享三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法,由于汇川IT6000系列触摸屏组态软件中没有三菱FX5U系列PLC的连接驱动,所以采用MODBUS TCP通信的方式实现。 具体步骤可…

OpenCV 图像旋转、平移、缩放

本文是 OpenCV图像视觉入门之路的第7篇文章&#xff0c;本文详细的进行了图像的缩放 cv2.resize()、旋转 cv2.flip()、平移 cv2.warpAffine()等操作。 OpenCV 图像旋转、平移、缩放目录 1 缩放图片 2 翻转图片 2.1 垂直翻转 2.2 水平翻转 2.3 水平垂直翻转 ​编辑 3 平移…

【docker常用命令】

一、帮助启动类命令 &#xff08;1&#xff09;启动docker systemctl start docker&#xff08;2&#xff09;停止docker systemctl stop docker&#xff08;3&#xff09;重启docker systemctl restart docker&#xff08;4&#xff09;查看docker状态 systemctl status…

JAVA零基础小白学习教程之day09-内部类权限final静态

day09-JAVAOOP 课程目标 1. 【理解】什么是内部类 2. 【掌握】匿名内部类 3. 【掌握】引用数据类型作为方法的参数 4. 【理解】final关键字的使用 5. 【理解】包的定义及使用 6. 【理解】权限修饰符 7. 【掌握】static关键字的使用B友https://www.bilibili.com/video/BV1QG4y…

SpringCloud 协同开发方案

相比Springboot开发&#xff0c;SpringCloud开发要复杂的多&#xff0c;因为涉及服务的注册发现&#xff0c;多个微服务模块间的调用等。 最简单的解决方案是每个开发者都在本地启动一套完整的开发环境&#xff0c;包括网关、nacos等各个组成微服务的模块&#xff0c;如果系统…

kubernetes常用命令

kubernetes常用命令 参考1 以kubesphere单节点集群结果为例 # kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-846…

Okhttp源码分析实践(八)【 实践环节:Okhttp断点下载功能的实现 】

上文,我们通过自己编写的okhttp框架,实现了下载功能,这节,我们在此基础上,一起来实现断点下载功能。 OkhttpStudy Demo Github源码 1. 需求及思考 需求:文件下载中途由于一些原因,停止下载,在异常原因(网络中断、暂停下载)解除之后,继续下载文件,可以接着目前的进…

Vue基本指令

1、前端技术的发展&#xff08;html、CSS、JavaScript&#xff09; ​ &#xff08;1&#xff09;jQuery&#xff1a;是对JavaScript进行了封装&#xff0c;使得操作DOM、事件处理、动画处理、ajax交互变得非常简洁、方便。是JavaScript的 库。 ​ &#xff08;2&#xff09…