2010-06-02 3 views
5

J'utilise les liaisons python rsvg pour afficher une image svg dans le cairo et l'enregistrer dans un fichier, ce qui fonctionne principalement. Mais si le fichier svg contient une image liée, comme ceci:rsvg ne restitue pas les images liées

<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 exécuté, mais je suppose qu'il y a un problème avec le fait qu'il s'agit normalement d'une URL relative, et non d'un chemin de fichier relatif. Comment puis-je contourner cela?

+0

J'ai le même problème. Mettre une url href invalide (lien vers un fichier qui n'existe pas) révèle que rsvg ne produira pas d'erreur s'il ne trouve pas le fichier. – molecular

Répondre

2

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

+1

n'a pas aidé pour moi :(Cela fonctionne sur une autre machine avec la même version de librsvg.Même sur cette machine archlinux, même.Revg-convertis moi-même .. n'a pas aidé. – molecular

+0

Même problème (en utilisant OSX 10.9) – tobinharris

2

Il semble que si le fichier que vous incluez ne se trouve 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.

+0

Une "fonctionnalité de sécurité" Je suppose que j'ai regardé la source et il n'y a aucun moyen de la désactiver à moins d'une recompilation.Il suffit de noter que cela a fonctionné sur Ubuntu 10.04, mais sur 12.04 cette 'fonctionnalité' a été ajoutée. –

11

De nombreux facteurs doivent être satisfaits pour LibRsvg afin de permettre le chargement d'une ressource image. 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 file:// doit être chemins absolus
  • file:// doit ê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ée à rsvg-convert via stdin, aucun chemin ne compte comme sous-répertoire du fichier d'entrée et toutes les images 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 LibRsvg source dans rsvg-base.c, la fonction _rsvg_handle_allow_load.

Pour ajouter une notification de débogage à RSVG-convert lors du chargement d'image échoue, on peut ajouter

#define G_ENABLE_DEBUG 

à config.h dans la source et recompiler.

2

Je voulais que le rendu de l'image librsvg fonctionne sur mon Mac pour accélérer le rendu SVG. La bonne réponse d'Ian Mackinnon a tous les ingrédients, mais la mise en œuvre d'un changement à la bibliothèque est difficile. Ces étapes ont permis à librsvg de restituer correctement les images liées avec des chemins relatifs. J'espère que cela fait gagner du temps à quelqu'un.

Tout d'abord, j'ai 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 personnel:

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 

J'ai effectué 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 pourriez avoir besoin d'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'ai également pu utiliser ImageMagick pour convertir SVGs avec des liens d'image par rapport à PNG fichiers si je l'ai installé après avoir installé librsvg de cette façon:

convert test.svg test.png 

cela vous permettra de tester rsvg fonction et la performance - je l'ai trouvé était 2-3x plus rapide que Inkscape pour mon application. Je recommande de modifier le code plus intelligemment si vous l'utilisez dans un environnement de production.

Questions connexes