To zabawne, że o to zapytałeś, niedawno zrobiłem to dla strony mojej pracy i pomyślałem, że powinienem napisać tutorial ... Oto jak to zrobić z PHP / Imagick, który używa 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();
kroki zastępowania kolorów wyrażeń regularnych mogą się różnić w zależności od ścieżki svg xml oraz sposobu przechowywania wartości identyfikatora i koloru. Jeśli nie chcesz przechowywać pliku na serwerze, możesz wyprowadzić obraz jako podstawowy 64, taki jak
<?php echo '<img src="data:image/jpg;base64,' . base64_encode($im) . '" />';?>
(przed użyciem wyczyść / zniszcz), ale np. ma problemy z PNG jako base64, więc prawdopodobnie będziesz musiał wypisać base64 jako jpeg
możesz zobaczyć tutaj przykład, który zrobiłem dla mapy obszaru sprzedaży byłego pracodawcy:
Start: https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
Koniec:
Edytować
Od czasu napisania powyższego wymyśliłem 2 ulepszone techniki:
1) zamiast pętli regex, aby zmienić stan wypełnienia, użyj CSS, aby utworzyć reguły stylu, takie jak
<style type="text/css">
#CA,#FL,HI{
fill:blue;
}
#Al, #NY, #NM{
fill:#cc6699;
}
/*etc..*/
</style>
a następnie możesz wykonać pojedynczą zamianę tekstu, aby wstrzyknąć swoje reguły css do svg przed kontynuowaniem tworzenia imagick jpeg / png. Jeśli kolory się nie zmieniają, sprawdź, czy w znacznikach ścieżki nie ma żadnych stylów wypełnienia wbudowanego, które przesłaniają css.
2) Jeśli nie musisz faktycznie tworzyć pliku obrazu jpeg / png (i nie musisz obsługiwać przestarzałych przeglądarek), możesz manipulować plikiem svg bezpośrednio za pomocą jQuery. Nie możesz uzyskać dostępu do ścieżek svg podczas osadzania svg za pomocą img lub tagów obiektu, więc musisz bezpośrednio dołączyć svg xml do html swojej strony internetowej, na przykład:
<div>
<?php echo file_get_contents('/path/to/blank/us-map.svg');?>
</div>
wtedy zmiana kolorów jest tak prosta, jak:
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">
$('#CA').css('fill', 'blue');
$('#NY').css('fill', '#ff0000');
</script>