给定SVG路径,如何以编程方式确定它创建的形状的宽度和高度?

给定SVG路径,如何以编程方式确定它创建的形状的宽度和高度?,svg,Svg,此脚本在无人参与的情况下运行,而不是在用户的浏览器中运行,因此没有JavaScript或DOM可用于获取边界框或其他类似技巧 我试图解决的问题: 我有几百种SVG字体 每个字体中的每个字符都由路径定义 我需要确定每个字符的高度和宽度 给定以下描述字符“e”的路径,“e”的维度是什么 M590-21q-2390-381.5150t-142.5376v38q0247129.5403.5t370.5155.5q220345-132t125-358v-177h-618l-2-6q11-8368-13

此脚本在无人参与的情况下运行,而不是在用户的浏览器中运行,因此没有JavaScript或DOM可用于获取边界框或其他类似技巧

我试图解决的问题:

  • 我有几百种SVG字体
  • 每个字体中的每个字符都由路径定义
  • 我需要确定每个字符的高度和宽度
  • 给定以下描述字符“e”的路径,“e”的维度是什么
M590-21q-2390-381.5150t-142.5376v38q0247129.5403.5t370.5155.5q220345-132t125-358v-177h-618l-2-6q11-8368-136.5t152-53.5q960153.5t145.552l80-206q-71-52-183.5-86.5t-241.5-34.5zM566-842q-73-109.5-52t-44.5-1395l30-1265q9182

在一些字体中,像小写L和大写I这样的字母是微不足道的。找到初始“移动到”位置,并从水平线和垂直线中减去该位置。但是,我找不到一种方法以编程方式解析路径字符串以找到它创建的形状的维度

以下是同一字体中小写L的路径:

M474 0h-337v1456h337v-1456z

路径中使用的速记代码是,但更易于阅读


解决方案

由于时间限制,我被迫为每个角色创建一个小SVG文件,并将其转换为PNG,然后修剪PNG以获得角色的尺寸

但是事实证明,我的问题比只需要角色的尺寸更复杂。某些字体中的字符具有前导空格。我最终需要精确地定位字符,当仅使用字符的宽度时,字体中定义的字符的前导空白会偏离定位。我需要确定字符的宽度和前导空白的宽度。无法使用简单的
修剪
来获得字符的宽度和前导空格,我必须像这样保留前导空格:

转换$svg\u文件\u名称-重力西-背景白色-拼接1x0-背景黑色-拼接1x0-修剪+重新分页-切掉1x0$png\u文件\u名称


然后,我再次修剪图像以找到角色的尺寸,并在最终项目中定位SVG时使用前导空白的大小作为负偏移。

@RobertLongson没有涉及浏览器或JavaScript。这是一个处理SVG字体的python或PHP脚本。我想做的是编写我自己的getBBox()函数。这太宽了,因为路径可以包含许多不同的对象,并且计算每个对象的边界,例如bezier曲线并不是一件小事。@RobertLongson我最初的直觉反应是用ImageMagick创建修剪过的单字符图像,但可能也可以。。。虽然我希望只调用字符串上的函数,并返回高度和宽度…使用imagemagick的
convert
-trim
,剩余的大小是字体的宽度和高度。看见用于批处理模式。@AlvinK。我认为你是对的。我需要从这个小问题开始,着手更大的项目。使用
convert
可能是解决此问题的最快方法(我的工作量最少)。出于性能方面的考虑,我真的希望有一个函数能够对路径字符串进行数学处理。也许我会在20年或30年后有时间再讨论这个问题。@RobertLongson没有涉及浏览器或JavaScript。这是一个处理SVG字体的python或PHP脚本。我想做的是编写我自己的getBBox()函数。这太宽了,因为路径可以包含许多不同的对象,并且计算每个对象的边界,例如bezier曲线并不是一件小事。@RobertLongson我最初的直觉反应是用ImageMagick创建修剪过的单字符图像,但可能也可以。。。虽然我希望只调用字符串上的函数,并返回高度和宽度…使用imagemagick的
convert
-trim
,剩余的大小是字体的宽度和高度。看见用于批处理模式。@AlvinK。我认为你是对的。我需要从这个小问题开始,着手更大的项目。使用
convert
可能是解决此问题的最快方法(我的工作量最少)。出于性能方面的考虑,我真的希望有一个函数能够对路径字符串进行数学处理。也许我会在20年或30年后有时间的时候重温这一点。