2012-02-10 86 views
3

我有以下代碼:如何使用PHP Imagick讀取給定大小的SVG?

$image = new Imagick(); 
$image->setBackgroundColor(new ImagickPixel('green')); 
$image->setSize(20,20); 
$image->readImageBlob(file_get_contents('./some/path/image.svg')); 

給它裝上SVG得很好,但在setSize剛剛被完全忽略。它呈現在550x100,按照它的定義:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
    width="550px" height="100px" viewBox="0 0 550 100" 
    enable-background="new 0 0 550 100" xml:space="preserve"> 

有沒有人有在獲得SVG文件發揮好與setSize經驗?

+0

你想調整它嗎?我發現通過加載svg作爲xml更容易 – k102 2012-02-10 10:31:25

+0

@ k102你的意思是在將XML傳遞給'readImageBlob'之前修改XML?這可能只是工作.. – Matthew 2012-02-10 10:32:42

+0

嗯...在我的情況下,我只需要調整SVG圖像並在瀏覽器中顯示它。你需要什麼?Imagick? – k102 2012-02-10 11:01:59

回答

5

setSize()函數僅適用於原始圖像格式,而不適用於SVG。您需要使用scaleImage(),而不是...

$image = new Imagick(); 
$image->setBackgroundColor(new ImagickPixel('green')); 
$image->readImage('./some/path/image.svg'); 
$image->scaleImage(20,20); 

順便說一句,這將正常工作,如果你正在縮減你的SVG圖像以較小的尺寸(如你在這種情況下),對於任何人誰是正在升級它,你需要做另一件事。如果你只是像上面那樣改變尺寸,它會出現鋸齒和像素化。在這種情況下,你需要使用setResolution()增加這樣的解決方案:

$image = new Imagick(); 
$image->setResolution(2000,2000); 
$image->setBackgroundColor(new ImagickPixel('green')); 
$image->readImage('./some/path/image.svg'); 
$image->scaleImage(1000,1000); 

的setResolution(實際值)應該被計算爲72 *(final_size/original_size)(嗯,我認爲這是正確的公式無論如何)。但任何價值至少達到這個價值或更高的價值也會正常工作。

3

關於按比例放大SVGs:隨着我的當前設置(的ImageMagick 6.7.8-1 2012年10月3日Q16SVGrw+)保存在90x30像素的SVG不能與setResolution()和​​甚至擴大。如果我將SVG以更高的尺寸重新保存,例如9000x3000,則可以按照上述說明安全地放大或縮小SVG。