使用Python获取SVG图形的边界框?

5
我想提取SVG图形的边界框。
由于Python已经在系统中可用并且也用于执行其他任务,因此我不想使用JavaScript或任何其他语言。我的理解是如果可以计算单个元素的边界框(但我不知道如何计算),则整个图形的边界框就是所有元素的最小和最大x、y值,因此可能需要计算所有元素的边界框。
我是Python初学者,但是svgwrite可能不是正确的模块,到目前为止,我对在Windows系统上安装rsvg感到害怕。
感谢任何提示,并指向正确的方向。

我没有使用过,但有一个叫做svgpathtools的东西。 - Bill Bell
谢谢,@BillBell,至少它承诺“为路径或线段找到边界框”。我会尝试的... - theozh
如何使用Python获取SVG路径的高度、宽度和长度。 - Paul Rooney
如何获取路径组合的边界框,似乎只适用于单个路径。 - rcShahi
2个回答

1

可能有更直接的方法来实现这个目标,但是像这样做应该可以满足您的要求。

您可以使用svg2paths方法将文件转换为路径对象列表,并对它们进行迭代。

from svgpathtools import svg2paths

def get_bbox(svg_file):
    paths, _ = svg2paths(svg_file)

    for i, path in enumerate(paths):
        if i == 0:
            # Initialise the overall min-max with the first path
            xmin, xmax, ymin, ymax = path.bbox()
        else:
            # Expand bounds to match path bounds if needed
            p_xmin, p_xmax, p_ymin, p_ymax = path.bbox()
            xmin = p_xmin if p_xmin < xmin else xmin
            xmax = p_xmax if p_xmax > xmax else xmax
            ymin = p_ymin if p_ymin < ymin else ymin
            ymax = p_ymax if p_ymax > ymax else ymax
    
    print(xmin, xmax, ymin, ymax)

get_bbox("myfile.svg")

谢谢!第一次测试后,这似乎返回了所需的坐标。因此,“svg2paths()”是缺失的部分。 - theozh
这看起来很合理,但从效率的角度考虑,仅使用内置的排序函数会更好吗? - Shmack

0
这个简单的包可以完成任务:svgpathtools 以下是一个示例:
from svgpathtools import parse_path

path = 'M 0,0 H 4.681 V 0.234 H 0 V 0 m 2.457,-2.223 v 4.68 H 2.223 v -4.68 h 0.234'
path_alt = parse_path(path)
print(path_alt.bbox())

# output: (0.0, 4.681, -2.223, 2.457)

谢谢。这很好,但我不只是有一个路径,而是一个完整的SVG文档,我想知道它的边界框。因此,我可能首先需要提取SVG中的所有路径,然后找到所有这些盒子的最小和最大坐标。我需要尝试一下,看看这是否真的会给出总边界框,或者是否还有其他需要考虑的事情。那圆形、矩形和其他非路径对象呢? - theozh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接