Je travaille sur un projet Web qui implique une carte générée dynamiquement des États-Unis colorant différents états en fonction d'un ensemble de données.
Ce fichier SVG me donne une bonne carte vierge des États-Unis et il est très facile de changer la couleur de chaque état. La difficulté est que les navigateurs IE ne prennent pas en charge SVG, donc pour que j'utilise la syntaxe pratique offerte par svg, je devrai le convertir en JPG.
Idéalement, j'aimerais faire cela avec uniquement la bibliothèque GD2, mais je pourrais également utiliser ImageMagick. Je n'ai absolument aucune idée de comment procéder.
Toute solution qui me permettrait de changer dynamiquement les couleurs des États sur une carte des États-Unis sera considérée. La clé est qu'il est facile de changer les couleurs à la volée et que c'est un navigateur croisé. Solutions PHP / Apache uniquement, s'il vous plaît.
Réponses:
C'est drôle que vous ayez posé cette question, je viens de le faire 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:
les étapes de remplacement des couleurs regex peuvent varier en fonction du chemin svg xml et de la façon dont vos valeurs d'identifiant et de couleur sont stockées. Si vous ne souhaitez pas stocker de fichier sur le serveur, vous pouvez générer l'image en base 64 comme
(avant d'utiliser clear / destroy) mais c'est-à-dire a des problèmes avec PNG comme base64 donc vous devrez probablement sortir base64 comme jpeg
vous pouvez voir un exemple ici que j'ai fait pour la carte du territoire de vente d'un ancien employeur:
Début: https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
Terminer:
Éditer
Depuis l'écriture de ce qui précède, j'ai mis au point 2 techniques améliorées:
1) au lieu d'une boucle regex pour changer l'état de remplissage, utilisez CSS pour créer des règles de style comme
puis vous pouvez faire un seul remplacement de texte pour injecter vos règles css dans le svg avant de procéder à la création imagick jpeg / png. Si les couleurs ne changent pas, assurez-vous qu'aucun style de remplissage en ligne dans vos balises de chemin ne remplace le css.
2) Si vous n'avez pas à créer un fichier image jpeg / png (et que vous n'avez pas besoin de prendre en charge les navigateurs obsolètes), vous pouvez manipuler le svg directement avec jQuery. Vous ne pouvez pas accéder aux chemins svg lors de l'incorporation du svg à l'aide de balises img ou object, vous devrez donc inclure directement le svg xml dans votre page Web HTML comme:
puis changer les couleurs est aussi simple que:
la source
$dom = new DOMDocument(); $dom->loadXML( $svg ); $dom->getElementsByTagName('image')->item(0)->setAttribute('id', $state); $svg = $dom->saveXML();
Vous mentionnez que vous faites cela parce que IE ne prend pas en charge SVG.
La bonne nouvelle est que IE prend en charge les graphiques vectoriels. D'accord, c'est donc sous la forme d'un langage appelé VML que seul IE prend en charge, plutôt que SVG, mais il est là, et vous pouvez l'utiliser.
Google Maps, entre autres, détectera les capacités du navigateur pour déterminer s'il faut servir SVG ou VML.
Ensuite, il y a la bibliothèque Raphael , qui est une bibliothèque graphique basée sur un navigateur Javascript, qui prend en charge SVG ou VML, toujours en fonction du navigateur.
Un autre qui peut aider: SVGWeb .
Tout cela signifie que vous pouvez prendre en charge vos utilisateurs IE sans avoir à recourir à des graphiques bitmap.
Voir aussi la réponse principale à cette question, par exemple: XSL Transformer SVG en VML
la source
Lors de la conversion de SVG en PNG transparent, n'oubliez pas de mettre ceci AVANT
$imagick->readImageBlob()
:la source
C'est très simple, je travaille sur ce sujet depuis quelques semaines.
Vous avez besoin de la boîte à outils Batik SVG . Téléchargez et placez les fichiers dans le même répertoire que le SVG que vous souhaitez convertir en JPEG , assurez-vous également de le décompresser en premier.
Ouvrez le terminal et exécutez cette commande:
Cela devrait générer un JPEG du fichier SVG. Vraiment facile. Vous pouvez même simplement le placer dans une boucle et convertir des charges de SVG,
la source
Je ne connais pas de solution PHP / Apache autonome, car cela nécessiterait une bibliothèque PHP capable de lire et de rendre des images SVG. Je ne suis pas sûr qu'une telle bibliothèque existe - je n'en connais pas.
ImageMagick est capable de pixelliser les fichiers SVG, soit via la ligne de commande ou la liaison PHP, IMagick , mais semble avoir un certain nombre de bizarreries et de dépendances externes comme indiqué par exemple dans ce fil de discussion du forum . Je pense que c'est toujours la voie la plus prometteuse à faire, c'est la première chose que j'examinerais si j'étais toi.
la source
Ceci est une méthode pour convertir une image svg en gif à l'aide des outils standard de PHP GD
1) Vous mettez l'image dans un élément de canevas dans le navigateur:
Et puis convertissez-le sur le serveur (ProcessPicture.php) de (par défaut) png en gif et enregistrez-le. (vous auriez pu aussi enregistrer au format png puis utiliser imagepng au lieu de image gif):
la source
Vous pouvez utiliser Raphaël — JavaScript Library et y parvenir facilement. Cela fonctionnera également dans IE.
la source
ou en utilisant: démo potrace : Tool4dev.com
la source