我尝试在SVG文件上使用getimagesize()
,但它失败了。
我知道SVG是“可缩放矢量图形”,但我发现Google Chrome的“评论元素”可以完美地获得SVG图片的尺寸,所以我怀疑这在PHP中也是可能的。
如果难以得到尺寸,有没有办法判断SVG图像是垂直还是水平?
答案 0 :(得分:13)
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);
需要强制转换值,否则它们将返回一个对象。
答案 1 :(得分:9)
事情是:SVG图像在您可能正在考虑的意义上没有“大小”。另一方面,它们具有高宽比。
此比率通常可以在viewBox
属性中找到。
另一方面,如果根SVG元素上不存在viewBox
属性,则图像比率非常难以确定。
修改强>
旁注:Chrome为您提供完美坐标的原因并不一定是因为它会查看SVG来确定大小;它很可能是设置大小的简单结果。
尽管SVG元素确实具有height
和width
属性,但这些属性可能不会被指定为像素,而是指定为多个单元中的任何一个,因此它们不一定有很多帮助。 / p>
答案 2 :(得分:4)
我有同样的问题,因为我找不到答案,发明并解决如下:
<?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值并将其拆分以获取值。
智利圣地亚哥的问候
答案 3 :(得分:3)
Regarding dimensions there are basically three different types of SVG images:
Fixed dimensions: Images that have width
and height
attributes. Chrome can show these dimensions perfectly and converts the specified units to pixels.
Proportional dimensions: SVG images with a viewBox
attribute. Chrome shows the size of such images maximized to 300x150
. So an image with a 16:9 ratio is shown as 267x150
.
No dimensions: SVG images without width
, height
and viewBox
. Chrome (and other browsers as well) use a default size of 300x150
for such images.
It is possible to do get the dimensions with PHP by reading the contents of the SVG image with PHPs DOM extension and applying the rules from above. I wrote the PHP library contao/imagine-svg that does exactly that and can be used as follows:
$size = (new Contao\ImagineSvg\Imagine)
->open('/path/to/image.svg')
->getSize();
echo $size->getWidth();
echo $size->getHeight();
If you don’t want to rely on a third party library, you can look at the source code of the getSize()
method to see how the library determines the dimensions.
答案 4 :(得分:0)
这是一个快速且肮脏的 hack,用于使用正则表达式检查视图框的大小。它在大多数情况下都可以使用,但是可以查看其他答案以了解其局限性。
date_of_birth
答案 5 :(得分:0)
带有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];