C'est drôle que vous demandiez cela, je viens de faire cela récemment pour le site de mon travail et je pensais que je devrais écrire un tutoriel... Voici comment le faire avec PHP/Imagick, qui utilise 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();
Les étapes du remplacement des couleurs par l'expression rationnelle peuvent varier en fonction du chemin svg xml et de la manière dont les valeurs d'identification et de couleur sont stockées. Si vous ne souhaitez pas stocker un fichier sur le serveur, vous pouvez sortir l'image en base 64 comme suit
<?php echo '<img src="data:image/jpg;base64,' . base64_encode($im) . '" />';?>
(avant d'utiliser clear/destroy) mais ie a des problèmes avec les PNG en base64 donc vous devrez probablement sortir en base64 comme jpeg.
Vous pouvez voir ici un exemple que j'ai réalisé pour la carte du territoire de vente d'un ancien employeur :
Commencez : https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
Finition :
Modifier
Depuis que j'ai écrit ce qui précède, j'ai mis au point deux techniques améliorées :
1) au lieu d'une boucle regex pour changer l'état de remplissage, utilisez les CSS pour établir des règles de style comme suit
<style type="text/css">
#CA,#FL,HI{
fill:blue;
}
#Al, #NY, #NM{
fill:#cc6699;
}
/*etc..*/
</style>
et ensuite vous pouvez faire un simple remplacement de texte pour injecter vos règles css dans le svg avant de procéder à la création du jpeg/png imagick. Si les couleurs ne changent pas, vérifiez que vous n'avez pas de styles de remplissage en ligne dans vos balises path qui remplacent les règles css.
2) Si vous n'avez pas besoin de créer un fichier image jpeg/png (ni de prendre en charge des navigateurs obsolètes), vous pouvez manipuler le svg directement avec jQuery. Vous ne pouvez pas accéder aux chemins d'accès des svg lorsque vous les intégrez à l'aide des balises img ou object, vous devez donc inclure directement le xml du svg dans le html de votre page web :
<div>
<?php echo file_get_contents('/path/to/blank/us-map.svg');?>
</div>
alors changer les couleurs est aussi simple que :
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">
$('#CA').css('fill', 'blue');
$('#NY').css('fill', '#ff0000');
</script>
0 votes
Existe-t-il des classes conçues pour porter SVG vers VML ? De cette façon, vous pourriez toujours avoir une solution de type 'HTML5'.
0 votes
Jetez un coup d'œil à ma réponse. C'est exactement ce dont vous avez besoin.