Python将SVG的一部分提取为PNG

我一直在进行大量搜索,但无法完全找到答案。

我有一系列相对简单的SVG图像。我在我感兴趣的图像关键区域上绘制了SVG矩形,现在想将这些区域提取为PNG图像。我不知道解决此问题的最佳方法。

想法1)在将SVG rect坐标转换为PNG坐标后,将整个SVG转换为PNG,然后使用say PIL裁剪图像。我现在开始努力使用此方法,但我希望有更好,更轻松的方法!

我正在为此使用Python 3.7。

编辑1:

这是我正在查看的屏幕截图。原始图像是SVG,我想将绿色矩形下的区域提取为PNG图像。

Python将SVG的一部分提取为PNG

编辑2:

从想法1开始,我有以下代码,该代码基本上将SVG图像上的viewBox设置为绿色矩形之一,然后设置其宽度和高度。从那里,我正在使用CairoSVG将SVG导出为PNG。

import cairosvg
import xml.etree.ElementTree as ET
...
with gzip.open(fileObj.filePath,'rb') as file:
    svg=file.read()
    svg=svg.decode('utf-8')
svgRoot=ET.fromstring(svg)
ET.register_namespace("","http://www.w3.org/2000/svg")
ET.register_namespace('xlink',"http://www.w3.org/1999/xlink")
annots = meta['annots']
for a in annots:
    r = ET.fromstring(a['g'])
    vb=" ".join([r.get('x'),r.get('y'),r.get('width'),r.get('height')])
    svgRoot.set("viewBox",vb)
    svgRoot.set("width",'128px')
    svgRoot.set("height",'128px')
    svg = ET.tostring(svgRoot,encoding="unicode")
    cairosvg.svg2png(svg,write_to="/home/test.png")

很不幸,它非常慢!一分钟以上的时间来提取两个PNG。 SVG文件很大(压缩了2-3 mb)并且非常详细。我不确定CairoSVG的工作方式,但是在将可见部分保存到PNG之前,即使它不可见,它也会在SVG中渲染所有内容吗?

任何有关优化或加快此速度的建议都会有很大帮助。

WOAI88521 回答:Python将SVG的一部分提取为PNG

这最终对我有用,尽管在较大的SVG图像上它相当慢:

import gzip
import cairosvg
import xml.etree.ElementTree as ET
...
with gzip.open(fileObj.filePath,'rb') as file:
    svg=file.read()
    svg=svg.decode('utf-8')
svgRoot=ET.fromstring(svg)
ET.register_namespace("","http://www.w3.org/2000/svg")
ET.register_namespace('xlink',"http://www.w3.org/1999/xlink")
annots = meta['annots']
for a in annots:
    r = ET.fromstring(a['g'])
    vb=" ".join([r.get('x'),r.get('y'),r.get('width'),r.get('height')])
    svgRoot.set("viewBox",vb)
    svgRoot.set("width",'128px')
    svgRoot.set("height",'128px')
    svg = ET.tostring(svgRoot,encoding="unicode")
    cairosvg.svg2png(svg,write_to="/home/test.png")
本文链接:https://www.f2er.com/3055666.html

大家都在问