【发布时间】:2011-09-25 19:28:59
【问题描述】:
我尝试在 SVG 文件上使用 getimagesize(),但失败了。
我知道 SVG 是“Scalable Vector Graphics”,但是我发现 Google Chrome 的“Review elements”可以完美的得到 SVG 图片的尺寸,所以我怀疑这在 PHP 中也是可以的。
如果很难得到尺寸,有没有办法判断SVG图片是垂直还是水平?
【问题讨论】:
标签: php svg dimensions
我尝试在 SVG 文件上使用 getimagesize(),但失败了。
我知道 SVG 是“Scalable Vector Graphics”,但是我发现 Google Chrome 的“Review elements”可以完美的得到 SVG 图片的尺寸,所以我怀疑这在 PHP 中也是可以的。
如果很难得到尺寸,有没有办法判断SVG图片是垂直还是水平?
【问题讨论】:
标签: php svg dimensions
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) ?谢谢
关于尺寸,基本上有三种不同类型的 SVG 图像:
固定尺寸:具有width 和height 属性的图像。 Chrome 可以完美显示这些尺寸,并将指定的单位转换为像素。
比例尺寸: 带有viewBox 属性的SVG 图像。 Chrome 显示这些图像的大小最大化为300x150。因此,比例为 16:9 的图像显示为 267x150。
无尺寸: 无 width、height 和 viewBox 的 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 了解该库如何确定尺寸。
【讨论】:
问题是:SVG 图像没有您可能想到的“大小”。另一方面,它们确实具有高宽比。
这个比率通常可以在viewBox 属性中找到。
另一方面,如果根 SVG 元素上不存在 viewBox 属性,则很难确定图像比例。
编辑:
旁注:Chrome 为您提供完美坐标的原因不一定是因为它会查看 SVG 来确定大小;这很可能是它设置大小的简单结果。
虽然 SVG 元素确实具有 height 和 width 属性,但它们可能未指定为像素,而是许多单位中的任何一个,因此它们不一定有很大帮助。
【讨论】:
viewbox,但似乎viewbox 也应该手动设置Dimensions,而不是自动设置。如何将SVG 转移到viewbox xml file?它应该保持图像纵横比。谢谢。
viewbox 为例,如果我知道width="500" height="300",我可以很容易地得到它。但真实的情况是我不知道。我只知道它的网址http://upload.wikimedia.org/wikipedia/commons/6/6c/Cog-scripted-svg.svg
width 和height 属性,并且至少在FF 3.6 中使用了width 和height,即显示图像的大小是70x100 而不是350x500。
我有同样的问题,因为我找不到答案,发明并解决如下:
<?php
$svgfile = simplexml_load_file("svgimage.svg");
$width = substr($svgfile[width],0,-2);
$height = substr($svgfile[height],0,-2);
?>
请注意,我使用的 SVG 文件是在 Adobe 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']);
这是一个 快速而肮脏的 hack,用于使用正则表达式检查视图框大小。它在大多数情况下都有效,但请查看其他答案以了解其局限性。
preg_match("#viewbox=[\"']\d* \d* (\d*) (\d*)#i", file_get_contents('file.svg'), $d);
$width = $d[1];
$height = $d[2];
【讨论】:
(\d*) 更改为 (\d*+(\.?+\d*)) 来解决此问题。 $height 位于第 3 位。
使用 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];
【讨论】: