通过python进行PNG转SVG

【Python】使用Python对pdf,svg,png等进行转换 使用Python对pdf,svg,png等进行转换 阅读详情

背景

在项目中遇到需要批量进行png to svg,虽然在linux上使用inlscape很方便,但是遇到大量的转换工作时,还是需要通过脚本替代人工。

在图片转换方面没有过研究,所以通过百度找其他人的经验。

但是发现好多文章不仅重复,而且将代码复制下来,无法使用。

还花了一些币进行脚本下载,但是毫无意外,还是无法使用。

通过百度搜索的到的资料都不能正常运行,总结归纳了如下脚本。

可以进行批量的转换,但转换速度还有优化空间,后续有时间再进行优化。

使用方法:

python3 pngtosvg.py

运行脚本,会自动寻找脚本所在的文件夹内的png格式的图片,并进行转换,并将转换的图片保存至同一文件夹内

python3 pngtosvg.py 指定目录

指定转换的文件夹目录,自动在指定目录寻找可转换的png图片,并将转换好的svg格式的图片保存至指定文件夹下

部分代码展示如下,代码有些繁琐,可以通过下方链接直接下载使用。

def rgba_image_to_svg_pixels(im):
	s = io.StringIO()
	s.write(svg_header(*im.size))

	width, height = im.size
	for x in range(width):
		for y in range(height):
			here = (x, y)
			rgba = im.getpixel(here)
			if not rgba[3]:
				continue
			s.write("""  <rect x="%d" y="%d" width="1" height="1" style="fill:rgb%s; fill-opacity:%.3f; stroke:none;" />\n""" % (x, y, rgba[0:3], float(rgba[3]) / 255))
		print ("Converting pixels: "+str(x*100/width) + "%")
	s.write("""</svg>\n""")
	return s.getvalue()


def joined_edges(assorted_edges, keep_every_point=False):
	pieces = []
	piece = []
	directions = deque([
		(0, 1),
		(1, 0),
		(0, -1),
		(-1, 0),
		])
	while assorted_edges:
		if not piece:
			piece.append(assorted_edges.pop())
		current_direction = normalize(direction(piece[-1]))
		while current_direction != directions[2]:
			directions.rotate()
		for i in range(1, 4):
			next_end = add_tuple(piece[-1][1], directions[i])
			next_edge = (piece[-1][1], next_end)
			if next_edge in assorted_edges:
				assorted_edges.remove(next_edge)
				if i == 2 and not keep_every_point:
					# same direction
					piece[-1] = (piece[-1][0], next_edge[1])
				else:
					piece.append(next_edge)
				if piece[0][0] == piece[-1][1]:
					if not keep_every_point and normalize(direction(piece[0])) == normalize(direction(piece[-1])):
						piece[-1] = (piece[-1][0], piece.pop(0)[1])
						# same direction
					pieces.append(piece)
					piece = []
				break
		else:
			raise Exception("Failed to find connecting edge")
	return pieces


def rgba_image_to_svg_contiguous(im, keep_every_point=False):

	# collect contiguous pixel groups
	
	adjacent = ((1, 0), (0, 1), (-1, 0), (0, -1))
	visited = Image.new("1", im.size, 0)
	
	color_pixel_lists = {}

	width, height = im.size
	for x in range(width):
		for y in range(height):
			here = (x, y)
			if visited.getpixel(here):
				continue
			rgba = im.getpixel((x, y))
			if not rgba[3]:
				continue
			piece = []
			queue = [here]
			visited.putpixel(here, 1)
			while queue:
				here = queue.pop()
				for offset in adjacent:
					neighbour = add_tuple(here, offset)
					if not (0 <= neighbour[0] < width) or not (0 <= neighbour[1] < height):
						continue
					if visited.getpixel(neighbour):
						continue
					neighbour_rgba = im.getpixel(neighbour)
					if neighbour_rgba != rgba:
						continue
					queue.append(neighbour)
					visited.putpixel(neighbour, 1)
				piece.append(here)

			if not rgba in color_pixel_lists:
				color_pixel_lists[rgba] = []
			color_pixel_lists[rgba].append(piece)
		print ("Converting image: "+str(round(x*100/width, 2)) + "%")
	del adjacent
	del visited

	# calculate clockwise edges of pixel groups

	edges = {
		(-1, 0):((0, 0), (0, 1)),
		(0, 1):((0, 1), (1, 1)),
		(1, 0):((1, 1), (1, 0)),
		(0, -1):((1, 0), (0, 0)),
		}
			
	color_edge_lists = {}

	counter = 0
	for rgba, pieces in color_pixel_lists.items():
		for piece_pixel_list in pieces:
			edge_set = set([])
			for coord in piece_pixel_list:
				for offset, (start_offset, end_offset) in edges.items():
					neighbour = add_tuple(coord, offset)
					start = add_tuple(coord, start_offset)
					end = add_tuple(coord, end_offset)
					edge = (start, end)
					if neighbour in piece_pixel_list:
						continue
					edge_set.add(edge)
			if not rgba in color_edge_lists:
				color_edge_lists[rgba] = []
			color_edge_lists[rgba].append(edge_set)
		counter = counter+1
		print ("Calculating edges: "+str(round(counter*100/len(color_pixel_lists.items()),2)) + "%")
	del color_pixel_lists
	del edges

	# join edges of pixel groups

	color_joined_pieces = {}

	for color, pieces in color_edge_lists.items():
		color_joined_pieces[color] = []
		for assorted_edges in pieces:
			color_joined_pieces[color].append(joined_edges(assorted_edges, keep_every_point))

	s = io.StringIO()
	s.write(svg_header(*im.size))

	counter = 0
	for color, shapes in color_joined_pieces.items():
		for shape in shapes:
			s.write(""" <path d=" """)
			for sub_shape in shape:
				here = sub_shape.pop(0)[0]
				s.write(""" M %d,%d """ % here)
				for edge in sub_shape:
					here = edge[0]
					s.write(""" L %d,%d """ % here)
				s.write(""" Z """)
			s.write(""" " style="fill:rgb%s; fill-opacity:%.3f; stroke:none;" />\n""" % (color[0:3], float(color[3]) / 255))
		counter = counter+1
		print ("Joining edges: "+str(round(counter*100/len(color_joined_pieces.items()), 2)) + "%")
	s.write("""</svg>\n""")
	return s.getvalue()

大家还可以下载源码后,自行修改,修改为转换指定的png图片,修改方法很简单.

可以通过此链接下载脚本:

图片格式转换+PNGtoSVG(亲测可用)-Python文档类资源-优快云下载

python将png图像转化成对应的svg图 SVG图像是由矢量定义的,这意味着它们是由数学公式表示的,而不是由像素网格组成的。此外,SVG图像中的文本是可选的,同时也是可搜索的,这使得SVG在制作如地图等需要文本交互的应用中特别有用。与JPEG和GIF图像相比,SVG图像通常具有更小的尺寸和更强的可压缩性。SVG严格遵从XML语法,使用文本格式的描述性语言来描述图像内容,因此它具有与图像分辨率无关的特性。总的来说,SVG矢量图是一种灵活且强大的图形格式,适用于需要高质量、可缩放和交互性的图形应用。上面代码有个问题,就是画出了轮廓,没有画出填充。 阅读详情

相关推荐

python svg转png

python svg转png import cairosvg import os for path, dir_list, file_list in os.walk('flags'): for file_name in file_list: if 'svg' in file_name: print(file_name) from_img = 'flags/' + file_name to_img = 'png/' + file_name.replace('svg', 'png')

pureszgd的博客 780

python把图片转换成svg的方法

【代码】python把图片转换成svg的方法。

2302_79777012的博客 1927

Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来

主要介绍了Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来

需要注意一点,这里有一个坑,在进行像素点矢量转换的时候,图片模式只支持RGB三色模式,以png为例子,如果是全彩的24位图是支持的,但是8位的png图显然无法进行转换,因为它的图片模式是P模式,在这种情况下,使用python脚本对图片进行转换之前,建议用photoshop对图片进行简单的模式转换。结语:使用python3结合svg,可以让你的网站更加生动有趣,现在浏览器对SVG支持的越来越好,可以放心大胆的使用pointer-events,也可以很好的改善SVG的交互体验。

刘悦的技术博客 8094

从零搭建芯片设计环境:在Cadence虚拟机中集成QRC进行寄生参数提取

本文详细介绍了在Cadence虚拟机中集成QRC工具进行芯片设计中的寄生参数提取的全流程。从环境准备、QRC安装配置到实际提取操作,提供了完整的步骤指南和常见问题解决方案,帮助工程师高效搭建芯片设计环境并优化提取性能。

weixin_30379531的博客 618

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 769

python svg转png_在Python中将SVG转换为PNG

How do I convert an svg to png, in Python? I am storing the svg in an instance of StringIO. Should I use the pyCairo library? How do I write that code?解决方案The answer is "pyrsvg" - a Python binding for...

weixin_39633954的博客 346

Dify 部署与使用

本文介绍了Dify社区版的快速部署指南,涵盖系统架构、环境配置和初始化流程。Dify采用微服务架构,通过Docker Compose一键部署8个核心容器,包括前端、后端、数据库等组件。部署过程包括克隆代码、配置环境变量和启动服务,首次启动需3-10分钟下载镜像。文章详细讲解了.env文件的配置要点,包括服务地址、数据库连接和向量存储设置,并提供了生产环境安全加固建议。最后通过访问/install页面完成管理员账号初始化,即可开始使用Dify构建AI应用。

海兰 595

python svg 转 png

【代码】python svg 转 png。

nongcunqq的博客 1114

pytorch-cifar100学习资料汇总 - 基于PyTorch的CIFAR-100图像分类实践

pytorch-cifar100是一个基于PyTorch实现CIFAR-100数据集图像分类的开源项目。该项目实现了多种经典的深度学习网络模型,如ResNet、DenseNet、VGG等,为开发者提供了在CIFAR-100数据集上进行图像分类实验的代码范例。pytorch-cifar100项目为我们提供了在CIFAR-100数据集上进行图像分类实验的完整代码实现。无论你是想要学习PyTorch的使用,还是研究不同网络模型在CIFAR-100上的表现,这个项目都是一个很好的起点。

helloaiworld的博客 1126

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 218

python SVG图片转PNG

今天采集了一个图片,但是是SVG的,我想把转化成PNG格式。1、安装 cairosvg 2、windows系统需要安装一个插件下载插件,并安装,配置环境变量,重启电脑(也可以试一试重启编辑器)下载插件地址:GitHub - tschoonj/GTK-for-Windows-Runtime-Environment-Installer: GTK+ for Windows Runtime Environment Installer (fork from http://gtk-win.sourceforge.n

得塔云的博客 2826

clock min pulse width检查

高电平脉宽 = clock fall edge到达FF/CK的时间 - clock rise edge到达FF/CK的时间;低电平脉宽 = 下一T clock rise edge到达FF/CK的时间 - clock fall edge到达FF/CK的时间。而required pulse width是根据FF/CK处的transition,根据查找表计算得到的。为什么clock transition越大,会导致required pulse width越大呢?5、 降低clock上的串扰。

芯冰乐 579

Python CairoSVG批量SVG转PNG

Python CairoSVG批量SVG转PNG简述CairoSVG安装使用方法 简述 在爬取某些网站的Icon时。发现Icon为svg标签,并不能以图片形式下载,便将svg标签直接存为.svg文件,后使用CairoSVG将其转变为PNG图片。 CairoSVG安装 CairoSVG是SVG到PNG,PDF,PS和SVG的转换器 在Windows上,您必须安装适用于Python和Cairo的Vi...

SlowFeather's blog 1896

YOLOv8改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 1082

【人工智能】 WebDev Arena:实时AI Web开发竞赛的技术探索与价值

《AI编程竞赛推动Web开发技术创新》摘要:WebDev Arena作为聚焦Web开发领域的实时AI编程竞赛,通过标准化竞技环境检验AI模型在代码生成、问题解决等方面的能力。竞赛覆盖前端、后端等全流程开发环节,采用实时评分机制,推动AI对复杂Web需求的理解和多元技术栈适配。该赛事不仅促进AI编程技术创新,更为Web开发行业与AI技术融合搭建桥梁,有望提升开发效率、降低技术门槛。未来将拓展Web3.0等前沿技术主题,持续推动行业智能化发展。(150字)

奶爸的编程之路,也就一周冷个三天 261

python svg转png_如何使用Python3实现svg转png与pdf(附转换源代码)

说明:SVG 意为可缩放矢量图形(Scalable Vector Graphics),SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失,png即可移植网络图形格式,也是一种位图文件存储格式,可以进行无损压缩。PDF(便携式文件格式,Portable Document Format)是由Adobe Systems在1993年用于文件交换所发展出的文件格式。但是有时我们需要将svg转png与...

weixin_39831902的博客 865

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python-svg转png

import cairosvg def svg2png(svgPath,pngPath): print(svgPath+" 转为 "+pngPath) cairosvg.svg2png(url=svgPath, write_to=pngPath)

billycoder的专栏 2209

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python svg转png_Python实现批量把SVG格式转成png、pdf格式的代码分

需要提前安装cairosvg模块,下载地址http://cairosvg.org/download/Code:#! encoding:UTF-8import cairosvgimport osloop = Truewhile loop:svgDir = raw_input("请输入SVG文件目录")if os.path.exists(svgDir) and os.path.isdir(svgDir...

weixin_39786706的博客 236

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python svg转png_Python实现批量把SVG格式转成png、pdf格式的代码分享

#! encoding:UTF-8import cairosvgimport osloop = Truewhile loop:svgDir = raw_input("请输入SVG文件目录")if os.path.exists(svgDir) and os.path.isdir(svgDir):loop = Falseelse:print "错误:您输入的SVG文件目录不存在或者不是一个有效的目录,...

weixin_40001395的博客 150

svg转png python(winodws环境)

svg转png python

O8088的博客 977

python图片转svg_使用python将PNG转换为SVG

Is there way to convert a png file into SVG file using only pure python or a python module such as wand?To be more precise, I want to convert a png into a real vector graphics, I don't want to embed a...

weixin_39907922的博客 1179

python图片转svg_在Python中将SVG转换为PNG

答案是“ pyrsvg ” -一个Python绑定的librsvg。有一个提供它的Ubuntu python-rsvg软件包。在Google上搜索其名称很不方便,因为其源代码似乎包含在“ gnome-python-desktop” Gnome项目GIT存储库中。我制作了一个极简的“ hello world”,将SVG渲染到开罗表面并将其写入磁盘:import cairoimport rsvgimg...

weixin_39712455的博客 562

python svg\png图片转icon

【代码】python svg\png图片转icon。

xingzhemengyou1的博客 176

python图片转svg,使用python将PNG转换为SVG

Is there way to convert a png file into SVG file using only pure python or a python module such as wand?To be more precise, I want to convert a png into a real vector graphics, I don't want to embed a...

weixin_39760434的博客 807
上一篇: 通过virt-install命令指定引导固件创建虚拟机
下一篇: asyncio 协程 异步执行
五个饺子馆
博客等级 码龄10年 4粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值