2011-06-30 151 views
10

我試圖在SVG文件上使用getimagesize(),但失敗了。如何獲得PHP中SVG圖片的寬度和高度?

我知道SVG是「Scalable Vector Graphics」,但我發現Google Chrome的「Review elements」可以很好地獲得SVG圖片的尺寸,所以我懷疑這也可以在PHP中使用。

如果難以得到尺寸,有什麼方法可以判斷SVG圖片是垂直還是水平?

回答

7

問題是:SVG圖像沒有一個「大小」,你可能正在考慮的意義上。另一方面,它們具有高寬比。

此比率通常可在viewBox屬性中找到。

另一方面,如果viewBox屬性不存在於根SVG元素上,則圖像比率非常不容易確定。

編輯:

邊注:之所以鉻爲您提供了完美的座標不一定是因爲它看起來在SVG來確定大小;這很可能是它的一個簡單的結果設置的大小。

儘管SVG元素確實具有heightwidth屬性,但它們可能不會被指定爲像素,而是指定爲多個單元中的任何一個,因此它們不一定會提供很多幫助。

+0

@Williham Totland,我已經閱讀過'viewbox',但似乎'viewbox'也應該手動設置'Dimensions',而不是自動的。如何將'SVG'轉換爲'viewbox''xml文件'?它應該保持圖像寬高比。謝謝。 – cj333

+0

@ cj333:解析錯誤。 –

+0

@Williham Totland,@Brian,對不起,我還不知道如何使用它。作爲'viewbox'的例子,如果我知道'width =「500」height =「300」'我可以很容易地得到它。但真實情況是我不知道它。我只知道它的URL是http:// upload.wikimedia.org/wikipedia/commons/6/6c/Cog-Scripted-svg.svg' – cj333

9

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); 

這些值需要轉換或返回一個對象。

+0

如何做到這一點?使用'simplexml_load_file(filename.svg)'?謝謝 – cj333

+0

你去:) - 編輯答案。是的,顯然是從文件中獲得的,只是完成了字符串XML來顯示它的工作。 – Brian

+0

順便說一句,正如Williham Totland所說,除非您控制SVG文件並確定事情,否則這些可能不能保證爲像素。 – Brian

3

我有同樣的問題,因爲我無法找到答案,創造和解決如下:

<?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值並分割它來獲取值。從聖地亞哥,智利

+1

'$ svgfile = simplexml_load_file($ imageFileName);''list($ x_start,$ y_start,$ x_end,$ y_end)= explode('',$ svgfile ['viewBox']);' –

+0

我喜歡這個解決方案,但是我已經看到寬度= 100%和高度= 100%的svg文件,可能會被考慮。 – Jonny

+0

解決方法:刪除高度和寬度中任何字母數字符號(「px」,「%」等):$ svgwidth = preg_replace(「/ [^ 0-9,。] /」,「」,$ svgfile [width] ); $ svgheight = preg_replace(「/ [^ 0-9,。] /」,「」,$ svgfile [height]); – Jonny

0

問候關於尺寸基本上有三種不同類型的SVG圖像的:

  1. 固定尺寸:有widthheight屬性圖像。Chrome可以完美顯示這些尺寸,並將指定的單位轉換爲像素。

  2. 比例尺寸:具有viewBox屬性的SVG圖像。 Chrome顯示最大化爲300x150的這種圖像的大小。因此,16:9比例的圖像顯示爲267x150

  3. 無尺寸: SVG圖像而不widthheightviewBox。 Chrome(以及其他瀏覽器)對這些圖像使用默認大小300x150

這是可以做到用PHP的DOM extension閱讀SVG圖像的內容,並從上述應用的規則獲得與PHP的尺寸。我寫的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怎麼看圖書館決定尺寸。

相關問題