Estoy trabajando en un proyecto web que involucra un mapa generado dinámicamente de los Estados Unidos coloreando diferentes estados basados en un conjunto de datos.
Este archivo SVG me da un buen mapa en blanco de los EE. UU. Y es muy fácil cambiar el color de cada estado. La dificultad es que los navegadores IE no son compatibles con SVG, por lo que para poder utilizar la útil sintaxis que ofrece svg, tendré que convertirlo a JPG.
Idealmente, me gustaría hacer esto solo con la biblioteca GD2, pero también podría usar ImageMagick. No tengo ni idea de cómo hacer esto.
Se considerará cualquier solución que me permita cambiar dinámicamente los colores de los estados en un mapa de los EE. UU. La clave es que es fácil cambiar los colores sobre la marcha y que es un navegador cruzado. Solo soluciones PHP / Apache, por favor.
Respuestas:
Es gracioso que hayas preguntado esto, acabo de hacer esto recientemente para el sitio de mi trabajo y estaba pensando que debería escribir un tutorial ... Así es como se hace con PHP / Imagick, que usa ImageMagick:
los pasos de reemplazo de color de expresiones regulares pueden variar según la ruta de svg xml y cómo se almacenan los valores de identificación y color. Si no desea almacenar un archivo en el servidor, puede generar la imagen como base 64 como
(antes de usar borrar / destruir) pero es decir, tiene problemas con PNG como base64, por lo que probablemente tenga que generar base64 como jpeg
puede ver un ejemplo aquí que hice para el mapa del territorio de ventas de un antiguo empleador:
Inicio: https://upload.wikimedia.org/wikipedia/commons/1/1a/Blank_US_Map_(states_only).svg
Terminar:
Editar
Desde que escribí lo anterior, se me ocurrieron 2 técnicas mejoradas:
1) en lugar de un bucle de expresiones regulares para cambiar el relleno en el estado, use CSS para hacer reglas de estilo como
y luego puede hacer un solo reemplazo de texto para inyectar sus reglas css en el svg antes de continuar con la creación de imagick jpeg / png. Si los colores no cambian, verifique que no tenga ningún estilo de relleno en línea en sus etiquetas de ruta que anulen el CSS.
2) Si no tiene que crear un archivo de imagen jpeg / png (y no necesita admitir navegadores obsoletos), puede manipular el svg directamente con jQuery. No puede acceder a las rutas de svg cuando incrusta el svg usando img o etiquetas de objeto, por lo que tendrá que incluir directamente el svg xml en su página web html como:
luego cambiar los colores es tan fácil como:
fuente
$dom = new DOMDocument(); $dom->loadXML( $svg ); $dom->getElementsByTagName('image')->item(0)->setAttribute('id', $state); $svg = $dom->saveXML();
Mencionas que estás haciendo esto porque IE no es compatible con SVG.
La buena noticia es que IE hace gráficos de vectores de soporte. De acuerdo, tiene la forma de un lenguaje llamado VML que solo admite IE, en lugar de SVG, pero está ahí y puedes usarlo.
Google Maps, entre otros, detectará las capacidades del navegador para determinar si sirve SVG o VML.
Luego está la biblioteca Raphael , que es una biblioteca de gráficos basada en navegador de Javascript, que admite SVG o VML, de nuevo dependiendo del navegador.
Otro que puede ayudar: SVGWeb .
Todo lo cual significa que puede brindar soporte a sus usuarios de IE sin tener que recurrir a gráficos de mapa de bits.
Consulte también la respuesta principal a esta pregunta, por ejemplo: XSL Transform SVG to VML
fuente
Al convertir SVG a PNG transparente, no olvide poner esto ANTES
$imagick->readImageBlob()
:fuente
Esto es muy fácil, he estado trabajando en esto durante las últimas semanas.
Necesita el kit de herramientas Batik SVG . Descargue y coloque los archivos en el mismo directorio que el SVG que desea convertir a JPEG , también asegúrese de descomprimirlo primero.
Abra la terminal y ejecute este comando:
Eso debería generar un JPEG del archivo SVG. Realmente fácil. Incluso puede colocarlo en un bucle y convertir montones de SVG,
fuente
No conozco una solución PHP / Apache independiente, ya que esto requeriría una biblioteca PHP que pueda leer y renderizar imágenes SVG. No estoy seguro de que exista una biblioteca así, no conozco ninguna.
ImageMagick es capaz de rasterizar archivos SVG, ya sea a través de la línea de comandos o el enlace PHP, IMagick , pero parece tener una serie de peculiaridades y dependencias externas como se muestra, por ejemplo, en este hilo del foro . Creo que sigue siendo el camino más prometedor a seguir, es lo primero que investigaría si fuera usted.
fuente
Este es un método para convertir una imagen svg en un gif utilizando herramientas estándar php GD
1) Pones la imagen en un elemento de lienzo en el navegador:
Y luego conviértalo en el servidor (ProcessPicture.php) de png (predeterminado) a gif y guárdelo. (también podría haber guardado como png y luego usar imagepng en lugar de image gif):
fuente
Puede usar Raphaël — JavaScript Library y lograrlo fácilmente. También funcionará en IE.
fuente
o usando: demostración de potrace : Tool4dev.com
fuente