[Accueil] - [Plan du site] - [Rechercher] - [ C O L R T S P ]  

 
SVG inkscape exporté en PNG avec métadonnées
 

par nojhan le 21 février 2008

Voici comment insérer des métadonnées d’un fichier SVG dans son export PNG, en utilisant Inkscape, la Python Imaging Library et un peu d’ElementTree.

Pourquoi

Pour publier des geekscottes sans me fatiguer, j’ai codé Strip-it, qui utilise le plus possible les métadonnées contenues dans les fichiers sources SVG (auteur, licence, descriptions, etc.). Mais on m’a fait remarquer récemment que le PNG (utilisé pour l’affichage de l’image) ne contenait pas ses métadonnées.

Or, le SVG étant encore peu lisible sous un navigateur (Firefox ne les lit que partiellement, avec une interface peu interactive), c’est plutôt le PNG qui est diffusé en pratique. Le problème est donc que, en pratique, des informations cruciales se perdent.

J’utilise Inkscape pour produire les SVG et exporter en PNG, mais malheureusement, il n’exporte pas les métadonnées avec l’image. J’ai posté une demande de fonctionnalité (cf. le bug 189954), mais en attendant, j’en ai profité pour bidouiller une solution.

Comment

Il existe plusieurs façons d’ajouter des métadonnées, notamment en jouant sur des formats existants comme EXIF ou XMP. Cependant, la plus simple est d’utiliser la norme PNG elle-même, qui prévoit le minimum, mais qui est déjà utile.

Celle-ci prévoit en effet des sections de métadonnées (les "text chunks") avec la plupart des champs utiles dans le cadre d’une diffusion sous licence, à savoir : titre, auteur, description, copyright, date de création, logiciel, source, commentaire générique, "disclaimer" et avertissement.

Il ne reste donc plus qu’à extraire les métadonnées du SVG, faire l’export PNG puis réinsérer les informations dans celui-ci... plus facile à dire qu’à faire.

Extraire les infos du SVG

Premier problème, extraire les informations du SVG. Dans Strip-it (en PHP), j’utilise une méthode brutale à base d’expressions régulières, qui ne devrait pas être très robuste sur la longueur. J’ai donc profité de l’occasion pour apprendre à me servir d’XPath (pour python, parce que PHP, ça va bien 5 minutes).

J’ai fini par choisir, parmi tous les modules disponibles pour XML, ElementTree, qui me paraissait le plus pythonique, malgré un support d’XPath partiel (mais qui me suffit en l’état).

Avec ElementTree, on peut faire quelque chose comme :


tree = ElementTree.parse( 'truc.svg')
print tree.findtext('//{http://web.resource.org/cc/}Agent/{http://purl.org/dc/elements/1.1/}title')

Pour gérer les espaces de noms, on remarque tout de suite que la syntaxe est longue et particulièrement fastidieuse. Heureusement, Filip Salomonsson propose un helper permettant de simplifier drastiquement. En y ajoutant l’ajout les crochets, on a quelque chose d’utilisable :


DC  = NS('http://purl.org/dc/elements/1.1/')
CC  = NS('http://web.resource.org/cc/')
tree.findtext('//'+CC('Agent')+'/'+DC('title'))

Problème, la norme PNG précise qu’il faut de l’ASCII, et le SVG utilise UTF-8. Pour des langues écrites en alphabet latin, une simple conversion au plus proche peut suffire. On trouve de tout sur le web pour faire ça, même des grosses tables de correspondances, alors que c’est très simple, en fait :


unicodedata.normalize('NFKD', text ).encode('ASCII', 'ignore')

On embarque le tout dans une fonction idoine, et au final on a un simple :


metadata['Author'] = self.xfind( tree, [ CC('Agent'),  DC('title') ] )

Exporter

L’export avec Inkscape est très simple, puisqu’il tiens en une ligne de commande :


os.popen( 'inkscape -z --export-png truc.png truc.svg ' )

Écrire les métadonnées

Rare sont les outils qui gèrent les métadonnées pour PNG. La PIL sait les lire, mais a plus de mal a les écrire (impossible avant la 1.6). Fort heureusement, Nick Galbreath a eu la bonne idée de proposer un hack.

Au final, c’est très simple :


Image.init()
im = Image.open( 'truc.png' )
im.info = metadata
self.pngsave( im, 'truc.png' )


Commentaires

Par huguesle 21 février 2008 : SVG inkscape exporté en PNG avec métadonnées
Y’a des malades qui te font remarquer qu’il n’y a pas les méta-informations ? Ou bien tu transposes tes fantasmes :) ?

    Par nojhanle 25 février 2008 : SVG inkscape exporté en PNG avec métadonnées
    J’ai vraiment reçu un email me le faisant remarquer... mais a posteriori je dois dire que c’est effectivement intéressant à faire, du fait de la licence libre qui incite à distribuer les images à tord et à travers (c’est à dire sans respecter vraiment la licence). Avec les métadonnées, au moins, tu as un peu plus de chance que les informations restent...

Articles populaires

[Accueil] - [Plan du site] - [Rechercher] - [Admin.]       SPIP:Squelette