使用python批量将svg转换成PNG

2023-10-28

CairoSVG介绍

CairoSVG是一个将SVG转为PNG,PDF, PS格式的库,当前版本的CairoSVG至少需要Python 3.5以上版本。

CairoSVG安装和使用

pip install cairosvg

通过命令行你就可以使用CairoSVG,以下代码能够将当前目录下的image.svg文件转换为image.png文件:

cairosvg image.svg -o image.png

命令参数

cairosvg --help
usage: cairosvg [-h] [-v] [-f {pdf,png,ps,svg}] [-d DPI] [-W WIDTH]
                [-H HEIGHT] [-s SCALE] [-u] [--output-width OUTPUT_WIDTH]
                [--output-height OUTPUT_HEIGHT] [-o OUTPUT]
                input

Convert SVG files to other formats

positional arguments:
  input                 input filename or URL 文件名或者url链接名

optional arguments:
  -h, --help            show this help message and exit 帮助
  -v, --version         show program's version number and exit 版本查看
  -f {pdf,png,ps,svg}   --format {pdf,png,ps,svg} output format 输出格式                      
  -d DPI, --dpi DPI     ratio between 1 inch and 1 pixel 输出图像dpi比率设置 DPI比率介于1英寸和1像素之间
  -W WIDTH, --width WIDTH    width of the parent container in pixels 输入图像宽
  -H HEIGHT, --height HEIGHT  height of the parent container in pixels 输入图像高
  -s SCALE, --scale SCALE    output scaling factor 输出图像缩放比例
  -u, --unsafe          resolve XML entities and allow very large files 解析XML实体
                        (WARNING: vulnerable to XXE attacks and various DoS) 但是有安全问题
  --output-width OUTPUT_WIDTH     desired output width in pixels 期望图像输出宽
  --output-height OUTPUT_HEIGHT   desired output height in pixels 期望图像输出高
  -o OUTPUT, --output OUTPUT     output filename 图像输出名

使用Python转换

https://doc.qt.io/qtforpython-6

import cairosvg
import os

inputFolder = "D:/tool/fritzing.0.9.4.64.pc_and_dll/fritzing.0.9.4.64.pc/fritzing-parts/svg/core/breadboard"    #输入的文件夹,里面有svg
outputFolder = "D:/Temp/output"  #输出的文件夹,将把结果放到此文件夹中

for root, dirs, files in os.walk(inputFolder):#遍历所有的文件
	for f in files:
		svgFile = os.path.join(root,f)  #svg文件名
		if f[-3:] == "svg":#确保是svg
			pngFile = outputFolder + "/" + f.replace("svg","png") #png文件名
			try: 
				cairosvg.svg2png(url=svgFile, write_to=pngFile, dpi=1900)
			except:
				print('error =>' + pngFile)
			finally:
				print('file => ' + pngFile)

封装成可操作的界面

"""PySide6 port of the linechart example from Qt v6.x"""

import os
import cairosvg
from PySide6.QtCore import (QCoreApplication, QDir, QFile, QFileInfo,
                            QIODevice, QTextStream, QUrl, Qt)
from PySide6.QtGui import QDesktopServices
from PySide6.QtWidgets import (QAbstractItemView, QApplication, QComboBox,
                               QDialog, QFileDialog, QGridLayout, QHBoxLayout,
                               QHeaderView, QLabel, QLineEdit,
                               QPushButton, QSizePolicy, QTableWidget,
                               QTableWidgetItem, QVBoxLayout, QWidget, QTextEdit)

# os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'D:\software\Anaconda3\Lib\site-packages\PySide6\plugins\platforms'

class Window(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 输入选择
        directory_label = QLabel("选择文件夹:")
        self._directory_combo_box = self.create_combo_box(QDir.currentPath())
        self._browse_button = self.create_button("&打开...", self.browse)

        # 输出选择
        output_directory_label = QLabel("输出到的文件夹:")
        self._output_directory_combo_box = self.create_combo_box(QDir.currentPath())
        self._output_browse_button = self.create_button("&选择...", self.output_browse)


        self._find_button = self.create_button("&转换", self.convert_svg2png)
        self.create_files_table()

        buttons_layout = QHBoxLayout()
        buttons_layout.addStretch()
        buttons_layout.addWidget(self._find_button)

        main_layout = QGridLayout()
        main_layout.addWidget(directory_label, 0, 0)
        main_layout.addWidget(self._directory_combo_box, 0, 1)
        main_layout.addWidget(self._browse_button, 0, 2)

        main_layout.addWidget(output_directory_label, 2, 0)
        main_layout.addWidget(self._output_directory_combo_box, 2, 1)
        main_layout.addWidget(self._output_browse_button, 2, 2)

        main_layout.addWidget(self._files_table, 3, 0, 1, 3)
        main_layout.addLayout(buttons_layout, 5, 0, 1, 3)
        self.setLayout(main_layout)

        self.setWindowTitle("将svg转换成png")
        self.resize(500, 300)

    def browse(self):
        self.directory = QFileDialog.getExistingDirectory(self, "转换",
                QDir.currentPath())

        if self.directory:
            if self._directory_combo_box.findText(self.directory) == -1:
                self._directory_combo_box.addItem(self.directory)

            self._directory_combo_box.setCurrentIndex(self._directory_combo_box.findText(self.directory))

    def output_browse(self):
        self.output_directory = QFileDialog.getExistingDirectory(self, "输出到",
                QDir.currentPath())

        if self.output_directory:
            if self._directory_combo_box.findText(self.output_directory) == -1:
                self._directory_combo_box.addItem(self.output_directory)

            self._directory_combo_box.setCurrentIndex(self._directory_combo_box.findText(self.output_directory))



    def convert_svg2png(self):
        for root, dirs, files in os.walk(self.directory):  # 遍历所有的文件
            for f in files:

                svgFile = os.path.join(root, f)  # svg文件名
                if f[-3:] == "svg":  # 确保是svg
                    pngFile = self.output_directory + "/" + f.replace("svg", "png")  # png文件名
                    try:
                        cairosvg.svg2png(url=svgFile, write_to=pngFile, dpi=1900)
                    except:
                        self._files_table.append('error =>' + pngFile)
                        print('error =>' + pngFile)
                    finally:
                        self._files_table.append('file => ' + pngFile)
                        print('file => ' + pngFile)

    def create_button(self, text, member):
        button = QPushButton(text)
        button.clicked.connect(member)
        return button

    def create_combo_box(self, text=""):
        combo_box = QComboBox()
        combo_box.setEditable(True)
        combo_box.addItem(text)
        combo_box.setSizePolicy(QSizePolicy.Expanding,
                QSizePolicy.Preferred)
        return combo_box

    def create_files_table(self):
        self._files_table = QTextEdit()
        self._files_table.setReadOnly(True)



if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec())


如果想选择单个文件或者是转换成不同的格式,可以自己添加。

参考:

[python] CairoSVG使用教程_落痕的寒假的博客-CSDN博客_cairosvg python

下载

svg2pngqt转换-桌面系统文档类资源-CSDN文库

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python批量将svg转换成PNG 的相关文章

  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • python 中的并行处理

    在 python 2 7 中进行并行处理的简单代码是什么 我在网上找到的所有示例都很复杂 并且包含不必要的代码 我该如何做一个简单的强力整数分解程序 在每个核心 4 上分解 1 个整数 我真正的程序可能只需要2个核心 并且需要共享信息 我知
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • ANTLR 获取并拆分词法分析器内容

    首先 对我的英语感到抱歉 我还在学习 我为我的框架编写 Python 模块 用于解析 CSS 文件 我尝试了 regex ply python 词法分析器和解析器 但我发现自己在 ANTLR 中 第一次尝试 我需要解析 CSS 文件中的注释
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 将seaborn.palplot轴添加到现有图形中以可视化不同调色板

    将seaborn人物添加到子图中是usually https seaborn pydata org examples cubehelix palette html创建图形时通过传递 ax 来完成 例如 sns kdeplot x y cma
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • Vuejs实践--事件绑定

    Vue中的事件绑定一般通过v on指令来绑定事件 事件绑定 v on 事件绑定的表达式的值可以是js语句 也可以是在methods选项中定义好的方法名 有参数的时候当然需要传参 在vue事件中 如果要用到事件对象e 要将e作为形参传入函数
  • SpringBoot 之 MDC 实现全链路调用日志跟踪

    文章目录 日志拦截器 修改日志格式 trackId 丢失解决 日志拦截器 import com evcas charge pile platform common annotation LogNoTrace import com evcas
  • STM32 基础系列教程 18 – IWDG

    前言 学习stm32 独立看门狗 IWDG 接口使用 学会用STM32内部独立看门狗 IWDG 实现程序异常时自复位功能 STM32F10xxx内置两个看门狗 提供了更高的安全性 时间的精确性和使用的灵活性 两个看门狗设备 独立看门狗和窗口
  • 计算机网络——SOCKET、TCP、HTTP之间的区别与联系

    文章目录 一 Socket 1 什么是socket 2 为什么需要socket 3 建立socket连接 4 socket分类 二 HTTP 基于TCP 1 HTTP的概念 2 HTTP连接的特点 2 1 连接请求 一次连接 2 2 连接请
  • 专栏《乔新亮的CTO成长复盘》读书笔记(技术架构篇)

    架构决策能力不但非常关键 而且是技术管理者最重要的能力和职责之一 而且职级越高就越重要 很多所谓的 技术债 也就是由一次次的决策失误不断累加而成的 管理者要能充分利用自己的技术视野和业务认知提前做好预判和布局 也就是上医治未病 做 T 型人
  • 滑动谜题 -- BFS

    滑动谜题 输入 board 4 1 2 5 0 3 输出 5 解释 最少完成谜板的最少移动次数是 5 一种移动路径 尚未移动 4 1 2 5 0 3 移动 1 次 4 1 2 0 5 3 移动 2 次 0 1 2 4 5 3 移动 3 次
  • Python Selenium 基本使用(详细步骤)

    一 简介 Selenium 是一个 web 应用程序自动化测试工具 对各种浏览器都能很好地支持 包括 Chrome Firefox 这些主流浏览器 使用它可以模拟浏览器进行各种各样的操作 包括爬取一些网页内容 当看到浏览器自己运行并且在网页
  • QtConcurrent 线程使用说明

    关于Qt Concurrent 我们首先来看看Qt Assitant是怎么描述的 The QtConcurrent namespace provides high level APIs that make it possible to wr
  • 关于UE4 vs2017 SpawnActor编译通过,调试运行崩溃的问题

    在制作VR模式代码编写的时候 使用一些API采用UWorld SpawnActor的时候出现代码编译编译通过无报错 但是调试运行失败的原因 找了很久才找到原因 原来是构造器的问题 就是把SpawnActor放到到BeginPlay 中 不能
  • oracle全文索引之commit与DML操作

    我们知道 无论对多大的数据做DML操作 执行commit都可以很快完成 但如何删除建有全文索引的记录 在commit时可能会很慢 根据推断可以知道是由于域索引造成的 那么在有域索引的情况下 commit时 oracle还做了那些额外工作呢
  • chatgpt赋能python:Python求全排列的介绍

    Python求全排列的介绍 在计算机科学中 全排列是一种排列的形式 将一组元素按照固定的顺序安排 在Python中 可以使用递归和迭代来求解全排列问题 本文将介绍如何用Python求全排列以及如何在SEO方面优化文章 递归方法 递归方法是通
  • 新形势下,企业如何进行数字化转型 附下载地址

    2020年谈企业数字化转型 有一个不变和四个变 不变的是企业面临的整体宏观环境和企业 多年发展积累的运营模式和管理能力 因此企业数字化转型面临的固有难点依然存在 四个 变化因素是疫情影响 5G部署 人工智能 AI 加快应用 以及中美技术加速
  • springboot中 拦截器无法访问数据库解决方法

    在springboot中使用拦截器时 拦截器中还需要访问数据库 会出现实例化数据库访问对象失败的现象 不管是添加 Componse还是添加 Servie 或者 Configuration 均不可以 需要做如下处理 方法如下 1 在集成Web
  • yolov5环境搭建与pytorch中torch、torchvision、torchaudio安装

    python软件安装 可以不单独安装 2条消息 Python安装教程 2022最新 学Python的阿杜的博客 CSDN博客 安装anaconda3 2020 2对应的python版本为3 7 不推荐 2020 11对应的python版本为
  • 数据库MySql python读取插入数据,insert对那些类型加单引号,表单自己参考自己(外键),空值和NULL

    今天做了下数据库作业 好多出错 记录下 查漏补缺 本次只是实现一个employee表单 特殊在有一个外键参考自身主键 并且老师给的数据该外键可为null 表结构直接用workbench 里面构造的 Navicat还没解决不修改密码策略的条件
  • Python中常用的运算符

    1 算数运算符 最常见的 标准算数运算符 加减乘除 取余运算符 幂运算符 2 赋值运算符 3 比较运算符 4 布尔运算符 5 位运算符 1 算数运算符 2 赋值运算符 3 比较运算符 对变量或表达式的结果进行大小 真假等比较 一个 称为赋值
  • python怎么用print打出赋值_python print 输出赋值到变量

    In 52 import io In 53 row ACME 50 91 5 In 54 join row TypeError Traceback most recent call last in gt 1 join row TypeErr
  • 在 SQL 里描述数据分布情况的时候,有 Cardinality 和 Selectivity 两个概念,有什么区别?

    What is the difference between cardinality and selectivity In SQL cardinality refers to the number of unique values in p
  • 分享一波粉丝面试真题-主要是偏管理方面的

    怎么改善团队低迷现状 改善团队低迷的现状是一个重要的管理挑战 以下是一些可能有助于改善团队状态的方法 深入了解问题 首先 需要了解低迷的原因 这可能涉及与团队成员的个人会谈 收集反馈 观察工作流程等 明确问题的性质对于采取适当的措施至关重要
  • 使用python批量将svg转换成PNG

    CairoSVG介绍 CairoSVG是一个将SVG转为PNG PDF PS格式的库 当前版本的CairoSVG至少需要Python 3 5以上版本 CairoSVG安装和使用 pip install cairosvg 通过命令行你就可以使