+
75
-

回答

在 Python 中将图片(如 PNG、JPG)转换为 SVG 格式有多种方法:

使用在线服务 API

这种方法通常能提供更专业、更精准的图像矢量化效果,但可能需要注册账户并获取 API 密钥,且有免费额度限制。

1. 使用 ConvertAPI

ConvertAPI 提供了一个简单易用的 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

800_auto

’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()

网友回复

我知道答案,我要回答