【问题标题】:How do you get the width and height of an SVG picture in PHP?如何在 PHP 中获取 SVG 图片的宽度和高度?
【发布时间】:2011-09-25 19:28:59
【问题描述】:

我尝试在 SVG 文件上使用 getimagesize(),但失败了。

我知道 SVG 是“Scalable Vector Graphics”,但是我发现 Google Chrome 的“Review elements”可以完美的得到 SVG 图片的尺寸,所以我怀疑这在 PHP 中也是可以的。

如果很难得到尺寸,有没有办法判断SVG图片是垂直还是水平?

【问题讨论】:

    标签: php svg dimensions


    【解决方案1】:

    SVG 只是一个 XML 文件,所以 GD 库没有任何帮助!

    您应该能够简单地解析 XML 文件以获取此类属性。

    $xml = '
    <svg width="500" height="300" version="1.1"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">
    
    <rect x="90" y="10"
        width="400" height="280"
        style="fill: rgb(255,255,255); stroke: rgb(0,0,0); stroke-width: 1; " />
    </svg>';
    
    $xmlget = simplexml_load_string($xml);
    $xmlattributes = $xmlget->attributes();
    $width = (string) $xmlattributes->width; 
    $height = (string) $xmlattributes->height;
    print_r($width);
    print_r($height);
    

    这些值需要强制转换,否则它们将返回一个对象。

    【讨论】:

    • 怎么做?使用simplexml_load_file(filename.svg) ?谢谢
    • 你去 :) - 编辑的答案。是的,显然是从文件中获取的,刚刚完成了字符串 XML 以显示它的工作原理。
    • 顺便说一句,正如 Williham Totland 所提到的,除非您可以控制 SVG 文件并且确定,否则这些可能无法保证是像素。
    【解决方案2】:

    关于尺寸,基本上有三种不同类型的 SVG 图像:

    1. 固定尺寸​​:具有widthheight 属性的图像。 Chrome 可以完美显示这些尺寸,并将指定的单位转换为像素。

    2. 比例尺寸: 带有viewBox 属性的SVG 图像。 Chrome 显示这些图像的大小最大化为300x150。因此,比例为 16:9 的图像显示为 267x150

    3. 无尺寸:widthheightviewBox 的 SVG 图像。 Chrome(以及其他浏览器)对此类图像使用默认大小300x150

    可以通过使用 PHP 读取 SVG 图像的内容 DOM extension 并应用上面的规则来获取尺寸。我编写的 PHP 库 contao/imagine-svg 正是这样做的,可以按如下方式使用:

    $size = (new Contao\ImagineSvg\Imagine)
        ->open('/path/to/image.svg')
        ->getSize();
    echo $size->getWidth();
    echo $size->getHeight();
    

    如果您不想依赖第三方库,可以查看source code of the getSize() method 了解该库如何确定尺寸。

    【讨论】:

      【解决方案3】:

      问题是:SVG 图像没有您可能想到的“大小”。另一方面,它们确实具有高宽比。

      这个比率通常可以在viewBox 属性中找到。

      另一方面,如果根 SVG 元素上不存在 viewBox 属性,则很难确定图像比例。

      编辑:

      旁注:Chrome 为您提供完美坐标的原因不一定是因为它会查看 SVG 来确定大小;这很可能是它设置大小的简单结果。

      虽然 SVG 元素确实具有 heightwidth 属性,但它们可能未指定为像素,而是许多单位中的任何一个,因此它们不一定有很大帮助。

      【讨论】:

      • @Williham Totland,我已经阅读了viewbox,但似乎viewbox 也应该手动设置Dimensions,而不是自动设置。如何将SVG 转移到viewbox xml file?它应该保持图像纵横比。谢谢。
      • @Williham Totland,@Brian,对不起,我仍然不知道如何使用它。以viewbox 为例,如果我知道width="500" height="300",我可以很容易地得到它。但真实的情况是我不知道。我只知道它的网址http://upload.wikimedia.org/wikipedia/commons/6/6c/Cog-scripted-svg.svg
      • @cj333:这个特定的例子很简单:取 viewBox 内容,按空间分割,从第三项中减去第一项得到 X 大小,从第四项中减去第二项得到 Y大小。
      • @Williham Totland,我不确定这是否微不足道。它还具有widthheight 属性,并且至少在FF 3.6 中使用了widthheight,即显示图像的大小是70x100 而不是350x500。
      • @binaryLV:正如我在回答中所说的那样;高度和宽度与 SVG 图像相对无关,这就是“S”的含义。解析 width 和 height 属性绝对不是微不足道的,因为它们可以用任意数量的奇怪单位指定,包括厘米甚至(颤抖)英寸。
      【解决方案4】:

      我有同样的问题,因为我找不到答案,发明并解决如下:

      <?php
          $svgfile = simplexml_load_file("svgimage.svg");
          $width = substr($svgfile[width],0,-2);
          $height = substr($svgfile[height],0,-2);
      ?>
      

      请注意,我使用的 SVG 文件是在 Adob​​e Illustrator 中创建的。所以,图片的svg代码如下:

      <?xml version="1.0" encoding="utf-8"?>
      <!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363)  -->
      <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
      <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
       width="400px" height="738px" viewBox="0 0 400 738" enable-background="new 0 0 400 738" xml:space="preserve">
      ...
      

      多亏了这个,我可以获得宽度和高度值。

      我使用substr,因为$svgfile[width] 返回带有“px”后缀的值。我还可以使用 viewBox 值并将其拆分以获取值。

      来自智利圣地亚哥的问候

      【讨论】:

      • $svgfile = simplexml_load_file($imageFileName); list($x_start, $y_start, $x_end, $y_end) = explode(' ', $svgfile['viewBox']);
      • 我喜欢这个解决方案,但我已经看到宽度=100% 和高度=100% 的 svg 文件,可以考虑。
      • 删除任何高度和宽度中的字母数字符号(“px”、“%”等)的解决方案:$svgwidth = preg_replace("/[^0-9,.]/", " ", $svgfile[宽度]); $svgheight = preg_replace("/[^0-9,.]/", "", $svgfile[height]);
      • @UjjwalSingh viewBox 属性可能使用空格或逗号分隔四个数字developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
      【解决方案5】:

      这是一个 快速而肮脏的 hack,用于使用正则表达式检查视图框大小。它在大多数情况下都有效,但请查看其他答案以了解其局限性。

      preg_match("#viewbox=[\"']\d* \d* (\d*) (\d*)#i", file_get_contents('file.svg'), $d);
      $width = $d[1];
      $height = $d[2];
      

      【讨论】:

      • 不适用于具有小数的 viewBox 值(完全有效)。您可以同时将 (\d*) 更改为 (\d*+(\.?+\d*)) 来解决此问题。 $height 位于第 3 位。
      【解决方案6】:

      使用 simplexml_load_file

      $svgXML = simplexml_load_file($imgUri);
      list($originX, $originY, $relWidth, $relHeight) = explode(' ', $svgXML['viewBox']);
      

      使用 preg_match 正则表达式 (这个适用于 viewBow 值中的 int 和 float 值)

      preg_match("#viewbox=[\"']\d* \d* (\d*+(\.?+\d*)) (\d*+(\.?+\d*))#i", file_get_contents($imgUri), $d);
      $relWidth = (float) $d[1];
      $relHeight = (float) $d[3];
      

      【讨论】:

      猜你喜欢
      • 2016-11-04
      • 2011-11-26
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2017-09-15
      • 2019-04-11
      • 2019-07-28
      相关资源
      最近更新 更多