Question

J'utilise les liaisons rsvg python pour rendre une image svg dans caire et enregistrer dans un fichier, qui fonctionne la plupart du temps. Mais si le fichier svg contient une image liée, comme ceci:

<image href="static/usrimgs/tmpDtIKpx.png" x="10" y="10" width="600px" height="400px"></image>

l'image ne montre pas dans le fichier final (le reste du svg rend très bien). Le chemin relatif est correct en fonction de l'endroit où le script est en cours d'exécution, mais je devine qu'il ya un problème avec le fait qu'il serait normalement une URL relative, pas un filepath relatif. Comment puis-je contourner cela?

Était-ce utile?

La solution 2

La réponse était de traiter les liens pour commencer par file:/// et être un chemin absolu.

Autres conseils

Il y a beaucoup de facteurs qui doivent être remplies pour librsvg pour permettre une ressource d'image à charger. A partir de V2.40 ceux-ci comprennent:

  • l'image doit avoir un attribut xlink:href
  • cet attribut doit contenir une complète, URI valide
  • le système peut être data:// ou file://
  • chemins de file:// doivent être absolue
  • chemins de file:// doivent être ou en dessous du chemin du fichier source SVG (après tout liens symboliques ont été déréférencé)

Notez que si l'entrée est passé à rsvg-convert via stdin, aucun des chemins comptent comme des sous-répertoires du fichier d'entrée et toutes les images de file:// seront refusées.

rsvg-convert < input.svg > output.png  # images denied

rsvg-convert -o output.png input.svg  # images allowed

Le code régissant la résolution des URL de l'image peut être trouvée dans la source librsvg rsvg-base.c, fonction _rsvg_handle_allow_load .

Pour ajouter une notification de débogage à rsvg-convert en cas d'échec de chargement d'image, on peut append

#define G_ENABLE_DEBUG

à config.h dans la source et recompilation.

Il semble que, si le fichier que vous incluez est pas sur le même chemin ou sous le chemin du fichier SVG que vous voulez convertir, il ne le trouvera pas. Je considère cela comme un bug.

Je voulais obtenir une image librsvg rendu à travailler sur mon Mac pour accélérer le rendu SVG. grande réponse de Ian Mackinnon a tous les ingrédients, mais la mise en œuvre d'un changement à la bibliothèque est délicate. Ces étapes ont fait correctement librsvg rendent les images liées avec des chemins relatifs. J'espère que cela sauve quelqu'un un certain temps.

D'abord, j'installé librsvg en utilisant:

brew install --build-from-source librsvg

Au moment de l'écriture, cela installe la version 2.40.13 et les bibliothèques nécessaires pour le construire. Je puis téléchargé et décompressé l'archive source dans mon répertoire:

wget https://download.gnome.org/sources/librsvg/2.40/librsvg-2.40.13.tar.xz
tar jxvf librsvg-2.40.13.tar.xz
cd librsvg-2.40.13

Je modifié la fonction _rsvg_handle_allow_load dans rsvg-base.c dans ce répertoire pour contourner les restrictions de chargement de chemin en ajoutant ce code autour de la ligne 2275:

2275
2276     goto allow; // Just try and load it!
2277     

J'ai aussi besoin de modifier la fonction rsvg_cairo_surface_new_from_href dans rsvg-image.c et arrêter le chargement en utilisant les types MIME - il suffit de remplacer la fonction comme ceci:

55     if (mime_type) {
56         // loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error);     // This doesn't work on my mac
57         loader = gdk_pixbuf_loader_new (); // This works
58     } else {
59         loader = gdk_pixbuf_loader_new ();
60     }

je devais utiliser ces commandes légèrement modifiées pour compiler et installer la bibliothèque modifiée:

make clean
make install gdk_pixbuf_binarydir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders gdk_pixbuf_moduledir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders

En fonction de votre système, vous devrez peut-être ajouter sudo aux commandes ci-dessus.

Une fois que cela a été fait, je pouvais rendre des liens SVG par rapport à l'aide de l'outil de ligne de commande rsvg-convert qui est installé avec librsvg:

rsvg-convert test.svg -o test.png

J'a pu utiliser ImageMagick pour SVGs convert avec des liens d'image par rapport aux fichiers PNG si je l'ai installé après avoir installé librsvg ainsi:

convert test.svg test.png

Cela vous permettra de tester la fonction rsvg et de la performance - je l'ai trouvé était 2-3x plus rapide que Inkscape pour mon application. Je recommande de changer le code de façon plus intelligente si vous utilisez ce dans un environnement de production.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top