這很有趣,你問這個問題,我只是做了這個最近對我的工作的網站,我想我應該寫一個教程...這裏是如何與ImageMagick的做到這一點:
$usmap = '/path/to/blank/us-map.svg';
$im = new Imagick();
$svg = file_get_contents($usmap);
/*loop to color each state as needed, something like*/
$idColorArray = array(
"AL" => "339966"
,"AK" => "0099FF"
...
,"WI" => "FF4B00"
,"WY" => "A3609B"
);
foreach($idColorArray as $state => $color){
//Where $color is a RRGGBB hex value
$svg = preg_replace(
'/id="'.$state.'" style="fill:#([0-9a-f]{6})/'
, 'id="'.$state.'" style="fill:#'.$color
, $svg
);
}
$im->readImageBlob($svg);
/*png settings*/
$im->setImageFormat("png24");
$im->resizeImage(720, 445, imagick::FILTER_LANCZOS, 1); /*Optional, if you need to resize*/
/*jpeg*/
$im->setImageFormat("jpeg");
$im->adaptiveResizeImage(720, 445); /*Optional, if you need to resize*/
$im->writeImage('/path/to/colored/us-map.png');/*(or .jpg)*/
$im->clear();
$im->destroy();
步驟正則表達式顏色替換可能因SVG路線XML以及如何存儲你的ID &顏色值會有所不同。如果您不希望文件存儲在服務器上,可以輸出基地64圖像像
<?php echo '<img src="data:image/jpg;base64,' . base64_encode($im) . '" />';?>
(使用前清晰/毀滅),但即有問題同巴新爲base64所以你可能要輸出的base64爲JPEG
,你可以在這裏看到一個例子,我做了一個前僱主的銷售區域地圖:
開始:https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
完成:
編輯
自寫上面,我拿出2種改進的技術:
1),而不是一個正則表達式循環改變狀態的填充,使用CSS製作樣式規則,如
<style type="text/css">
#CA,#FL,HI{
fill:blue;
}
#Al, #NY, #NM{
fill:#cc6699;
}
/*etc..*/
</style>
然後您可以將單個文本替換爲injec在繼續進行imagick jpeg/png創作之前,請將您的css規則導入到svg中。如果顏色不變,請檢查以確保您的路徑標記中沒有任何內聯填充樣式來覆蓋css。 2)如果你不必實際創建一個jpeg/png圖像文件(並且不需要支持過時的瀏覽器),你可以直接用jQuery來操縱svg。您無法訪問使用IMG或對象標籤嵌入SVG時,SVG的路徑,所以你必須直接包括SVG XML在網頁的HTML這樣的:
<div>
<?php echo file_get_contents('/path/to/blank/us-map.svg');?>
</div>
然後改變顏色是一樣簡單:
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">
$('#CA').css('fill', 'blue');
$('#NY').css('fill', '#ff0000');
</script>
是有設計的端口任何SVG班到VML?這樣你仍然可以有一個'HTML5'型解決方案 – Patrick 2011-01-26 19:54:26
看看我的答案。正是你所需要的 – 2011-01-26 20:48:40