【问题标题】:Python: SVG to PNG converting issuePython:SVG 到 PNG 的转换问题
【发布时间】:2021-06-03 13:02:58
【问题描述】:

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

我尝试使用 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!'在不和谐机器人上运行它时的消息,但我不确定这是否会影响任何东西。

【问题讨论】:

  • 这似乎是 Reportlab 3.5.60 的问题;有一个错误报告here。也许尝试更新或更旧的版本?

标签: python svg reportlab


【解决方案1】:

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

我也会尝试使用文件尺寸,但到目前为止,这就是我得到的。请注意,我的 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]

其中my_convert_function 包含相同的svg2rlgrenderPM.drawToFile,并返回正在写入的png 文件的名称。索引 'i' 是保存同一个 png 不同名称的多个副本。

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

【讨论】:

    【解决方案2】:

    格式参数必须大写

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

    【讨论】:

    • 遗憾的是,这对我没有任何改变。图像与之前完全相同。
    • 如果有任何不同(更新和版本),我也会在 replit 上运行我的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2020-10-17
    • 2011-07-19
    • 1970-01-01
    • 2013-01-27
    • 2011-03-15
    相关资源
    最近更新 更多