使用CairoSVG转换的SVG文件中PNG的透明度错误

0 投票
1 回答
1328 浏览
提问于 2025-04-18 04:49

我们正在使用CairoSVG(http://cairosvg.org/)把svg字符串数据转换成png格式,并将这个png返回给浏览器。这个svg字符串是直接从我们FusionCharts图表的getSVGString()方法中获取的。

如果我把这个字符串保存为本地的svg文件,然后在Illustrator或浏览器中打开,它看起来是没问题的。这里是svg数据:http://pastebin.com/GG0vqWF4

这张图片应该是这样的:http://pbrd.co/1nE9y11

但是在返回给浏览器的png中,所有的圆圈都是空的:http://pbrd.co/1nE9IFL

这里是进行转换的Python代码:

import cherrypy
import cairocffi as cairo
import cairosvg
...

class SaveImagePage(LoggedInPage):
    @cherrypy.expose
    def index(self, svgString, **params):
        png = cairosvg.svg2png(svgString)

        cherrypy.response.headers['content-type'] = 'image/png'
        cherrypy.response.headers['content-disposition'] = \
            'attachment; filename="BrandIndex Chart.png"'

        return png

有没有什么想法?我对svg格式不太熟悉,而且Cairo没有抛出任何错误;我不太确定这里可能出了什么问题。

1 个回答

1

这看起来是CairoSVG的问题。

关于你遇到的具体问题,早期版本的FusionCharts(3.4之前)在生成的SVG字符串中有%和:这些字符的问题。最新版本的FusionCharts修复了这个问题,生成的SVG在使用Inkscape和Batik库导出时没有问题。

我已经替换了你分享的SVG字符串中的问题字符%和:,然后用Inkscape和Cairo导出了。在Inkscape中导出的图片是正确的,但在Cairo中问题依然存在。

如果你愿意使用其他导出库,可以选择Inkscape。不过FusionCharts也有自己的导出功能,如果你想让导出的png文件在浏览器中下载,使用FusionCharts的导出功能就可以满足这个需求。

撰写回答