在 Python 中将图片(如 PNG、JPG)转换为 SVG 格式有多种方法:
使用在线服务 API
这种方法通常能提供更专业、更精准的图像矢量化效果,但可能需要注册账户并获取 API 密钥,且有免费额度限制。
1. 使用 ConvertAPIConvertAPI 提供了一个简单易用的 Python 客户端,可以快速地将多种格式的图片转换为 SVG。
优点:
转换质量高。
支持多种图片格式。
代码简单。
缺点:
需要网络连接。
有免费使用限制。
步骤:
安装 ConvertAPI 库:
pip install --upgrade convertapi
获取 API 密钥:在 ConvertAPI 网站注册一个免费账户以获取您的 API 密钥。
转换代码示例 (以 PNG 为例):
import convertapi # 设置您的 API 密钥 convertapi.api_secret = 'YOUR_API_SECRET' # 转换图片 result = convertapi.convert('svg', { 'File': '/path/to/your/image.png' }, from_format = 'png') # 保存转换后的 SVG 文件 result.save_files('/path/to/save/output.svg') print("图片已成功转换为 SVG!")
对于 JPG 文件,只需将 from_format 改为 'jpg' 并提供 JPG 文件路径即可。
2. 使用 Aspose 产品Aspose 提供了一系列强大的文件处理库,包括用于图像转换的 Aspose.Words 和 Aspose.SVG 等。
优点:
功能强大,可控选项多。
转换效果专业。
缺点:
通常是付费产品,但提供试用版。
库的体积可能较大。
步骤 (以 Aspose.Words for Python via .NET 为例):
安装库:
pip install aspose-words
代码示例:
import aspose.words as aw # 加载图片 doc = aw.Document() builder = aw.DocumentBuilder(doc) shape = builder.insert_image("input.png") # 设置保存选项 saveOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.SVG) # 保存为 SVG shape.get_shape_renderer().save("output.svg", saveOptions) print("图片已成功转换为 SVG。")
使用本地 Python 库
这种方法完全在本地运行,不需要依赖外部服务,更适合离线或批量处理。
3. pixels-to-svg这个库可以将像素图像转换为由多个 <path> 元素组成的 SVG,其中相同颜色的相邻像素会被合并成一个路径。
优点:
完全在本地运行。
生成的 SVG 结构相对清晰,便于编辑。
缺点:
对于复杂图像,生成的 SVG 文件可能会很大。
它创建的是像素化的矢量图,而不是平滑的曲线。
步骤:
安装库及其依赖:
pip install pixels-to-svg
它依赖于 svgwrite, Pillow, scipy, 和 cc3d。
代码示例:
from pixels_to_svg import pixels_to_svg # 转换图片 # input_path: 输入图片路径 # output_path: 输出 SVG 路径 # color_tolerance: 颜色容差,用于合并相似颜色 pixels_to_svg( input_path='path/to/your/image.png', output_path='path/to/save/output.svg', color_tolerance=20 ) print("图片已成功转换为像素化 SVG!")4. 自定义脚本 (基于 Pillow)
对于简单的需求,可以编写一个脚本,将图片的每个像素转换为 SVG 中的一个小的矩形。
优点:
完全可控,逻辑简单。
不依赖复杂的库。
缺点:
生成的 SVG 文件会非常大,并且渲染效率低。
不适合复杂或大尺寸的图片。
代码示例:
from PIL import Image def image_to_svg(image_path, output_path): with Image.open(image_path) as img: width, height = img.size # 确保图片是 RGB 模式 img_rgb = img.convert('RGB') with open(output_path, 'w') as f: f.write(f'<svg width="{width}" height="{height}" xmlns="http://www.w3.org/2000/svg">\\n') for y in range(height): for x in range(width): r, g, b = img_rgb.getpixel((x, y)) color = f'rgb({r},{g},{b})' f.write(f' <rect x="{x}" y="{y}" width="1" height="1" fill="{color}" />\\n') f.write('</svg>') # 使用方法 image_to_svg('path/to/your/image.png', 'path/to/save/output.svg') print("图片已成功转换为基于像素的 SVG。")
5、使用potrace
’https://potrace.sourceforge.net/#downloading
6、使用opencv与svgwrite
import cv2 import svgwrite # 读入并灰度化 img = cv2.imread("input.png", cv2.IMREAD_GRAYSCALE) # 边缘检测 edges = cv2.Canny(img, 100, 200) # 查找轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 保存为SVG dwg = svgwrite.Drawing("output.svg", profile='tiny') for contour in contours: points = [(int(p[0][0]), int(p[0][1])) for p in contour] dwg.add(dwg.polyline(points=points, stroke='black', fill='none')) dwg.save()
网友回复