Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中将SVG转换为PNG或JPEG?_Python_Svg_Png_Jpeg_Svgwrite - Fatal编程技术网

如何在Python中将SVG转换为PNG或JPEG?

如何在Python中将SVG转换为PNG或JPEG?,python,svg,png,jpeg,svgwrite,Python,Svg,Png,Jpeg,Svgwrite,我正在使用svgwrite生成svg文件,如何将它们转换为PNG或JPEG?要将svg转换为PNG,我可以想到两种方法: 一,。 以下是可以满足您需要的lib: python3代码: cairosvg.svg2png(url="/path/to/input.svg", write_to="/tmp/output.png") 已经在linux(Debian9+和Ubuntu18+)和MacOS上使用过。它的工作原理与1MB左右svg的大文件相同。示例:世界地图。Lib还允许导出pdf文件 提示:

我正在使用
svgwrite
生成svg文件,如何将它们转换为PNG或JPEG?

要将svg转换为PNG,我可以想到两种方法:

一,。 以下是可以满足您需要的lib:

python3代码:

cairosvg.svg2png(url="/path/to/input.svg", write_to="/tmp/output.png")
已经在linux(Debian9+和Ubuntu18+)和MacOS上使用过。它的工作原理与1MB左右svg的大文件相同。示例:世界地图。Lib还允许导出pdf文件

提示:cairosvg提供png输出图像的放大,因为使用矢量图形svg:)后,默认大小看起来很模糊。我无法让DPI选项为我工作

二,。 还有另一种方法可以做到这一点,即使用浏览器打开svg文件,并在Firefox或其他浏览器上使用SeleniumWebDriver拍摄屏幕截图。您可以将屏幕截图另存为png


可以使用Pillow将png转换为jpeg:

我查看了几种方法,包括cairo(我无法在Windows上使用)、svglib+reportlab(dpi无法更改),甚至inkscape(从命令行)

最后,这是我找到的最好的方法。我在Python3.7上测试了它

def convert(method, svg_file, png_file, resolution = 72):
    from wand.api import library
    import wand.color
    import wand.image

    with open(svg_file, "r") as svg_file:
        with wand.image.Image() as image:
            with wand.color.Color('transparent') as background_color:
                library.MagickSetBackgroundColor(image.wand, 
                                                 background_color.resource) 
            svg_blob = svg_file.read().encode('utf-8')
            image.read(blob=svg_blob, resolution = resolution)
            png_image = image.make_blob("png32")

    with open(png_file, "wb") as out:
        out.write(png_image)
我必须安装wand软件包(使用pip),然后安装ImageMagick for Windows()。

支持SVG加载。它是免费的、快速的,需要很少的内存,并且可以在macOS、Windows和Linux上运行

您可以这样使用它:

导入pyvips
image=pyvips.image.new\u from\u文件(“something.svg”,dpi=300)
image.write_到_文件(“x.png”)
默认DPI为72,可能有点低,但您可以设置任何喜欢的DPI。你可以用一种显而易见的方式写JPG

您还可以按需要的像素尺寸加载,如下所示:

导入pyvips
image=pyvips.image.缩略图(“something.svg”,200,高度=300)
image.write_到_文件(“x.png”)
这将使SVG适合200 x 300像素的框。这个

pyvips SVG加载器有一些很好的特性:

  • 它使用librsvg进行实际渲染,因此PNG将具有高质量的抗锯齿边
  • 它比像ImageMagick这样的系统要快得多,后者只需向inkscape提供渲染
  • 它支持渐进式渲染。大图像(每面超过几千像素)以分区方式渲染,即使对于非常大的图像,也可以控制内存使用
  • 它支持流,因此您可以直接将SVG渲染到一个巨大的深度缩放金字塔(例如),而不需要任何中间存储
  • 它支持来自内存区域、字符串和管道以及文件的输入
从字符串进行渲染非常方便,例如:

导入pyvips
x=pyvips.Image.svgload_缓冲区(b”“”
""")
x、 将_写入_文件(“x.png”)

在Windows上,在尝试导入PyVIP时,会出现诸如libgobject-2.0-0.dll、libvips-42.dll等错误。要使PyVIP在Windows上工作,请执行以下操作:

  • 从下载Windows的zip文件并解压缩到文件夹
  • pip安装pyvips
在代码中,请执行以下操作:

import os

# The bin folder has the DLLs
os.environ['path'] += r';C:\Path\ToYour\VIPsFolder\bin'

import pyvips

image = pyvips.Image.thumbnail("test.svg", 200)
image.write_to_file("test.png")

我建议使用pyvips而不是cairosvg。从我的测试来看,它比cairosvg快得多,特别是对于大型SVG。无论如何,要让cairosvg在Windows上工作,您需要使用类似于上述内容的工具。

我在SO中没有发现类似的问题。投了赞成票。你的问题似乎有一个答案:但是。。。这是另一种解放,对吗?但也许你需要它。@qräbnö既然svgwrite似乎不能处理svg到png的转换,那么。。。是的,你需要另一个图书馆。同样问题的另一个例子也可以在这里找到:
import os

# The bin folder has the DLLs
os.environ['path'] += r';C:\Path\ToYour\VIPsFolder\bin'

import pyvips

image = pyvips.Image.thumbnail("test.svg", 200)
image.write_to_file("test.png")