ImageMagick (ou autre) pour le texte UTF-8 à l'image

8

J'essaie de créer de nombreuses images à un seul caractère en utilisant convert. Le but est de fournir à un spécialiste des plastiques des images à imprimer sur les touches du clavier.

La documentation ImageMagick suggère quelque chose comme ceci:

 printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium command.png

ou

 echo ⌘ | convert -size 100x100 label:@- -font unifont-Medium command.png

ou

 convert -size 100x100 label:'⌘' -font unifont-Medium command.png

qui est censé imprimer le symbole du lieu d'intérêt , mais il produit à la place un point d'interrogation.

J'ai confirmé (en utilisant charmap) que le jeu de unifont-Mediumpolices inclut réellement ce glyphe. Je sais que d'autres polices sur mon système peuvent également fournir ce glyphe, car je pouvais le voir avant d'installer unifont, mais je n'ai pas pu déterminer leur nom.

J'ai également essayé d'utiliser LaTeX (par exemple TexLive avec tous les extras et le utf8xpackage) mais aucun des caractères spéciaux n'est pris en charge.

Il y a beaucoup de questions sur le forum sur l'impression de caractères chinois avec imagemagick et d'autres caractères spéciaux ... ce qui suit fonctionne pour moi:

convert -background lightblue -fill blue -pointsize 32 \
      label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ '    label_i8n.gif

mais cela ne fonctionne tout simplement pas pour les personnages UTF-8 qui sont réellement importants pour moi.

Comment convertir des caractères Unicode arbitraires en images?

MISE À JOUR : J'ai abandonné, ressemble à un bug. Au lieu de cela, j'ai créé un tas de scripts pour générer et rendre SVG, open source ici: kinesis-dvorak

fommil
la source
Je ne l'ai pas utilisé depuis longtemps, mais je suis certain que vous pouvez le faire avec une simple routine "script-fu" pour gimp . Cela peut ne pas vous être utile à moins que vous ne soyez familier avec gimp et que vous connaissiez l'un des schémas ou un autre langage qui héberge le plug-in (python, perl, tcl, il peut y en avoir plus) - mais je pensais que je lancerais là-bas juste au cas où.
goldilocks
Ce qui précède n'a pas fonctionné pour moi non plus. On dirait un bug dans imagemagick, non?
slm
Btw. J'ai fait une question connexe: comment combiner plusieurs polices en une seule
Grzegorz Wierzowiecki

Réponses:

10

J'ai essayé les mêmes commandes et obtenu les mêmes résultats.

$ printf "\u2318" | convert -size 100x100 label:@- \
        -font unifont-Medium command.png

                                                                           SS de police rendue

Le passage à l'unicode pour la lettre G fonctionne bien cependant:

$ printf "\u0047" | convert -size 100x100 label:@- \
       -font unifont-Medium command.png

                                                                           g

Je posterais cette question sur le site ImageMagick Discourse pour voir pourquoi cela se produit. Je peux vous aider si vous ne savez pas comment procéder ou procéder.

Débogage de conversion

Vous pouvez ajouter le -debug annotatecommutateur pour voir ce qui convertse passe.

Exemple

$ printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium -pointsize 40 -debug annotate command.png
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 24
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 12.75; height: 28; ascent: 22; descent: -5; max advance: 48; bounds: 1.25,0  13.5781,18; origin: 15,0; pixels per em: 24,24; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 48
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 25.5156; height: 55; ascent: 43; descent: -10; max advance: 96; bounds: 2.48438,0  27.1406,35.5; origin: 29,0; pixels per em: 48,48; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 95
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 52.0781; height: 109; ascent: 86; descent: -20; max advance: 190; bounds: 4.92188,0  53.7188,70; origin: 58,0; pixels per em: 95,95; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 94
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1406; height: 108; ascent: 85; descent: -20; max advance: 188; bounds: 4.85938,0  53.1562,68; origin: 57,0; pixels per em: 94,94; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 93
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1875; height: 107; ascent: 84; descent: -20; max advance: 186; bounds: 4.8125,0  52.5781,67; origin: 57,0; pixels per em: 93,93; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 92
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2344; height: 106; ascent: 83; descent: -19; max advance: 184; bounds: 4.76562,0  52.0156,67; origin: 56,0; pixels per em: 92,92; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 91
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2969; height: 105; ascent: 82; descent: -19; max advance: 182; bounds: 4.70312,0  51.4531,65.4688; origin: 56,0; pixels per em: 91,91; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 90
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 49.3438; height: 103; ascent: 81; descent: -19; max advance: 180; bounds: 4.65625,0  50.8906,65.4688; origin: 55,0; pixels per em: 90,90; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 89
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.3906; height: 102; ascent: 81; descent: -19; max advance: 178; bounds: 4.60938,0  50.3281,64; origin: 54,0; pixels per em: 89,89; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 88
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.4375; height: 101; ascent: 80; descent: -19; max advance: 176; bounds: 4.5625,0  49.7656,64; origin: 54,0; pixels per em: 88,88; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 87
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5; height: 100; ascent: 79; descent: -18; max advance: 174; bounds: 4.5,0  49.1875,63; origin: 53,0; pixels per em: 87,87; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86

MISE À JOUR # 1 - Débogage supplémentaire

Ce problème m'énervait donc je pense que je l'ai enfin compris. Le problème est la sélection de la police et le fait de ne pas pouvoir afficher ce glyphe particulier.

  1. Tout d'abord, vous pouvez utiliser cette commande pour voir les polices disponibles convert. Commençons donc par là.

    $ convert -list font | head -8
    
    Path: /etc/ImageMagick/type-ghostscript.xml
      Font: AvantGarde-Book
        family: AvantGarde
        style: Normal
        stretch: Normal
        weight: 400
        glyphs: /usr/share/fonts/default/Type1/a010013l.pfb
        ...
    

    Ce qui précède montre un exemple, chaque police a des lignes similaires à celles ci-dessus. Par ailleurs, l'exécution de cette commande montre que nous avons plusieurs centaines de polices:

    $ convert -list font | grep Font | wc -l
    262
    
  2. Ensuite, nous allons passer par la tâche d'encoder notre personnage, en \u2318utilisant toutes les polices que nous avons. Cela semble compliqué mais est assez trivial avec certains doublures bien pensées via Bash.

    $ for i in $(convert -list font | grep Font | awk '{print $2}'); \
        do convert -font $i -pointsize 36 label:⌘  ${i}.gif;done
    

    Cet extrait utilisera une boucle for pour parcourir chaque police, exécutant une version modifiée de votre convertcommande.

  3. Maintenant, nous regardons les résultats. De nombreuses polices ne pouvaient pas afficher ce glyphe particulier, mais plusieurs le pouvaient, ce qui semblerait indiquer qu'il ne s'agit pas nécessairement d'un bogue dans ImageMagick, mais plutôt d'une limitation des polices elles-mêmes. Voici une liste des polices que j'avais qui pouvaient afficher ce glyphe.

    • DejaVu-Sans-Bold
    • DejaVu-Sans-Bold-Oblique
    • DejaVu-Sans-Book
    • DejaVu-Sans-Condensed-Bold
    • DejaVu-Sans-Condensed-Bold-Oblique
    • DejaVu-Sans-Condensed
    • DejaVu-Sans-Condensed-Oblique
    • DejaVu-Sans-Mono-Bold
    • DejaVu-Sans-Mono-Bold-Oblique
    • DejaVu-Sans-Mono-Book
    • DejaVu-Sans-Mono-Oblique
    • DejaVu-Sans-Oblique
    • DejaVu-Serif-Bold
    • DejaVu-Serif-Bold-Italic
    • DejaVu-Serif-Book
    • DejaVu-Serif-Condensed-Bold
    • DejaVu-Serif-Condensed-Bold-Italic
    • DejaVu-Serif-Condensed
    • DejaVu-Serif-Condensed-Italic
    • DejaVu-Serif-Italic
    • FreeMono-Regular
    • FreeSerif-Regular
    • STIX-Math-Regular
    • STIX-Regular
    • VL-Gothic-regular

    J'ai parcouru visuellement l'ensemble des ~ 260 .giffichiers résultants pour déterminer ceux qui fonctionnaient et ceux qui ne fonctionnaient pas. Voici un échantillon de quelques-uns de ceux qui ont fonctionné juste pour que vous puissiez les voir.

                                                ss1    ss2    ss3    ss4    ss5

Références

slm
la source
1
merci beaucoup pour l'analyse! J'ai abandonné ... J'ai mis à jour la question avec la solution éventuelle, qui impliquait l'utilisation de SVG et d'Inkscape pour rendre les polices en chemins.
fommil
@fommil - semble être un problème de police. Voir les mises à jour.
slm
serait assez agréable d'avoir la commande finale dans la réponse (sélection de la police)
Boris Däppen
Pour moi, l'ajout de l'option a -font DejaVu-Sans-Boldaidé à marquer une image avec le crâne de pirate: perl -e 'binmode(STDOUT, ":utf8");print "Skull: \x{2620}";' |convert picture_orig.jpg -background none -fill red -pointsize 90 -font DejaVu-Sans-Bold label:@- -flatten picture_tagged.jpgmerci pour votre superbe aide!
Boris Däppen du
Merci @slm! Votre réponse a contribué à ma résolution: unix.stackexchange.com/a/389474/9689
Grzegorz Wierzowiecki