2010-12-03 Une image à partir d'une police

Dernière modification

Résumé : Comment extraire aisément (hummm...) un caractère d'une police ttf pour en faire une image vectorielle individuelle.

Modifié(e) :

< http://www.k1ka.be/pics/ampersand.png

à

> http://www.k1ka.be/pics/ampersand.png{{Cette esperluette est celle de la police romaui__.ttf du paquet ttf-uralic: http://packages.debian.org/lenny/ttf-uralic}}


http://www.k1ka.be/pics/ampersand.png1

Il y a des polices de caractères qui comprennent de jolis glyphes qu'on aimerait parfois utiliser individuellement. On peut bien sûr les utiliser en tant que caractère avec un traitement de texte, en les agrandissant bien au-delà des tailles usuelles; on peut aussi les importer dans Gimp et en tirer une image bitmap.

Mais ces façons de faire présentent des inconvénients. Il n'est pas toujours facile de trouver le caractère correspondant quand il s'agit d'une police de type symbole (que celui qui prétend n'avoir jamais passé plus de 10 minutes à trouver le http://www.k1ka.be/pics/uniE200.png ou le http://www.k1ka.be/pics/uni260E.png dans un traitement de texte lève la main).

Et la sauvegarde sous forme d'image bitmap est parfois moins intéressante que la forme vectorisée2. L'idéal serait un format eps qui permettrait de l'utiliser à la fois dans un traitement de texte conventionnel, et dans Latex, sans avoir à se prendre la tête pour installer une police.

Il existe quelques utilitaires en ligne de commande qui permettent de réaliser cela, presque sans pleurer.

Prenons la police OpenLogos sur le site de http://ico.ma/, qui comprend une petite ménagerie où figurent manchot, gnou, caméléon, dauphin, éléphant...

http://www.k1ka.be/pics/gnu_mascot.png

On peut se servir de Fntsample pour imprimer un catalogue de tous les caractères d'une police. C'est assez simple:

  $ fntsample -f ~/.fonts/openlogos.ttf -o openlogos.pdf

et le résultat permet de savoir quel code numérique associer au caractère recherché.

On appelle alors à la rescousse ttf2eps, un petit utilitaire inclus dans Fontforge, mais qui ne semble pas empaqueté systématiquement avec ce logiciel (en tout cas, il n'est pas inclus dans le paquet de la debian). On le trouve sur le CVS du projet:

http://fontforge.cvs.sourceforge.net/viewvc/fontforge/fontforge/fonttools/ttf2eps.c?view=log

Il se compile aisément:

 $ gcc -o ttf2eps ttf2eps.c 
 $ ls -l ttf2eps
 -rwxr--r-- 1 gv gv 25232 déc  3 16:15 ttf2eps
 $ strip ttf2eps
 $ ls -l ttf2eps
 -rwxr--r-- 1 gv gv 20516 déc  3 16:15 ttf2eps
 $ ./ttf2eps
 Must have exactly one truetype filename argument
 gv@fantasio:~/tmp$ ./ttf2eps --help
 Unknown argument --help
 Usage: ./ttf2eps [-all] {-glyph num | -name name | -unicode hex | -uni hex} truetypefile

On peut spécifier le caractère souhaité par son nom ou son codage ("it's unicode encoding, or it's true type glyph number").

Dans la pratique, j'ai constaté que la numérotation indiquée par Fntsample pouvait être utilisée avec l'option -uni :

  $ ttf2eps -uni 0055  ~/.fonts/openlogos.ttf

Le fichier résultant portera le nom du caractère:

  $ ls -l *eps
  -rw-r--r-- 1 gv gv 32113 déc  3 15:31 gnu_mascot.eps

Attention qu'avec l'option -all, les fichiers correspondants aux caractères «vides» seront produits également, ça en représente quelques bonnes dizaines, et c'est assez emmerdant...

À ce stade, on constate cependant que l'image est inutilement grande: 1787 points3 soit plus de 60 cm de large, ce qui fera ramer le traitement de texte.

Alors il reste à faire appel à epsffit, qui fait partie des utilitaires psutils, et permet de repréciser la «boîte englobante» d'une image eps.

 $ epsffit
 epsffit release 1 patchlevel 17
 Copyright (C) Angus J. C. Duggan, 1991-1995. See file LICENSE for details.
 Usage: epsffit [-c] [-r] [-a] [-m] [-s] llx lly urx ury [infile [outfile]]
 $ epsffit 0 0 100 100 gnu_mascot.eps gnu_mascot_2.eps

Le fichier transformé ne diffère que par quelques instructions de déplacement et de mise à l'échelle4. C'est celui qui figure plus haut dans la page, converti pour cela en png. Ça n'a pas été sans mal :-), mais une fois qu'on connaît la procédure, le résultat est net, compact, sans bavure.

Pour info, toujours en ligne de commande, il est aussi possible de convertir cette image

Footnotes:

1. Cette esperluette est celle de la police romaui__.ttf du paquet ttf-uralic: http://packages.debian.org/lenny/ttf-uralic
2. Cela doit être possible avec un logiciel de dessin vectoriel, mais personnellement, avec Inkscape, dont je n'ai pas la pratique, j'ai rapidement abandonné. Comme quoi les interfaces graphiques ne sont pas la panacée.
3. desktop publishing point ou points PostScript, voir http://en.wikipedia.org/wiki/Point_%28typography%29
4. Pour ceux que ça intéresse:
 $ diff gnu_mascot*eps
 1a2
 > %%BoundingBox: 100 266 1687 1810
 6d6
 < %%BoundingBox: 0 0 99 97
 8,13d7
 < %%BeginProcSet: epsffit 1 0
 < gsave
 < -6.301 -16.761 translate
 < 0.063 0.063 scale
 < %%EndProcSet
 < 
 1086d1079
 < grestore
5. qui fait partie du paquet Debian texlive-extra-utils. On le trouve aussi dans les archives du CTAN: http://www.ctan.org/tex-archive/support/epstopdf/