我一直在进行大量搜索,但无法完全找到答案。
我有一系列相对简单的SVG图像。我在我感兴趣的图像关键区域上绘制了SVG矩形,现在想将这些区域提取为PNG图像。我不知道解决此问题的最佳方法。
想法1)在将SVG rect坐标转换为PNG坐标后,将整个SVG转换为PNG,然后使用say PIL裁剪图像。我现在开始努力使用此方法,但我希望有更好,更轻松的方法!
我正在为此使用Python 3.7。
编辑1:
这是我正在查看的屏幕截图。原始图像是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中渲染所有内容吗?
任何有关优化或加快此速度的建议都会有很大帮助。