很有趣,你问到这个问题,我最近刚为公司的网站做了这件事,并且我在想我应该写一个教程...以下是如何使用PHP/Imagick进行操作,它使用ImageMagick:
$usmap = '/path/to/blank/us-map.svg';
$im = new Imagick();
$svg = file_get_contents($usmap);
$idColorArray = array(
"AL" => "339966"
,"AK" => "0099FF"
...
,"WI" => "FF4B00"
,"WY" => "A3609B"
);
foreach($idColorArray as $state => $color){
$svg = preg_replace(
'/id="'.$state.'" style="fill:#([0-9a-f]{6})/'
, 'id="'.$state.'" style="fill:#'.$color
, $svg
);
}
$im->readImageBlob($svg);
$im->setImageFormat("png24");
$im->resizeImage(720, 445, imagick::FILTER_LANCZOS, 1);
$im->setImageFormat("jpeg");
$im->adaptiveResizeImage(720, 445);
$im->writeImage('/path/to/colored/us-map.png');
$im->clear();
$im->destroy();
根据SVG路径XML以及ID和颜色值的存储方式,正则表达式颜色替换的步骤可能会有所不同。如果您不想在服务器上存储文件,可以将图像输出为Base64格式。
<?php echo '<img src="data:image/jpg;base64,' . base64_encode($im) . '" />';?>
(在使用clear/destroy之前) 但是ie存在PNG作为base64的问题,因此你可能需要将base64输出为jpeg
你可以在这里看到我为以前雇主的销售领域地图制作的例子:
开始:https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
![](https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg)
完成:![enter image description here](https://istack.dev59.com/pRHSD.webp)
编辑
自撰写上述内容以来,我想出了两种改进技术:
1)不使用正则表达式循环来更改状态的填充,而是使用CSS创建样式规则,例如
<style type="text/css">
#CA,#FL,HI{
fill:blue;
}
#Al, #NY, #NM{
fill:#cc6699;
}
</style>
然后,您可以进行单个文本替换以将CSS规则注入SVG,然后再继续使用Imagick创建JPEG / PNG。如果颜色没有改变,请检查是否在路径标签中有任何内联填充样式覆盖了CSS。
2)如果您不必实际创建jpeg / png图像文件(并且不需要支持过时的浏览器),则可以直接使用jQuery操作SVG。当使用img或object标签嵌入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>