首页 > 解决方案 > Python:SVG 到 PNG 的转换问题

问题描述

更新:我尝试在 chess.svg.board 中增加大小,它以某种方式清除了 size = 的所有渲染问题9001800

我尝试使用 svglib 和 reportlab 从 .svg 制作 .png 文件,代码如下所示:

import sys
import chess.svg
import chess
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM

board = chess.Board("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR")

drawing = chess.svg.board(board, size=350)
f = open('file.svg', 'w')
f.write(drawing)

drawing = svg2rlg("file.svg")
renderPM.drawToFile(drawing, "file.png", fmt="png")

如果您尝试打开 file.png,则图像中有很多缺失的部分,我猜这是渲染问题。你怎么能解决这个问题?

旁注:也得到了很多 'x_order_2: colinear!' 在不和谐机器人上运行它时的消息,但我不确定这是否会影响任何东西。 在此处输入图像描述

标签: pythonsvgreportlab

解决方案


这个!!我在使用相同的库时遇到了同样的错误......我没有找到解决方案,但只是一种解决方法,在您的情况下可能不会有太大帮助,其中生成带的形状在垂直方向上不是很稀疏。

我也会尝试使用文件尺寸,但到目前为止这就是我得到的。请注意,我的 svg 由白色背景上的黑色形状组成(因此255 - x在以下代码中)

由于条带的外观非常随机,并且连续多次处理同一个文件会产生不同的结果,我决定利用随机性:我所做的是将相同的 svg 导出几次到不同的 png 中,然后导入它们全部放入一个列表中,然后只获取所有导出图像中的白色像素,例如:

images_files = [my_convert_function(svgfile=file, index=i) for i in range(3)]
images = [255 - imageio.imread(x) for x in images_files]
result = reduce(lambda a,b: a & b, images)
imageio.imwrite(<your filename here>, result)
[os.remove(x) for x in images_files]

wheremy_convert_function包含相同的svg2rlgand renderPM.drawToFile,并返回正在写入的 png 文件的名称。索引“i”是保存同一个 png 不同名称的多个副本。

这是一些非常粗糙的代码,但我希望它可以帮助其他有同样问题的人


推荐阅读