2 votes

ImageFont détecter le glyphe manquant (Python Pillow)

Voici un court exemple.

from PIL import ImageFont, ImageDraw

draw = ImageDraw.Draw(image)

# utilise une police bitmap
font = ImageFont.load("arial.pil")

draw.text((10, 10), "bonjour", font=font)

# utilise une police TrueType
font = ImageFont.truetype("arial.ttf", 15)

draw.text((10, 25), "monde", font=font)

Je veux savoir si la police manque de certains glyphes dans le texte rendu.

Quand j'essaie de rendre un glyphe qui manque, j'obtiens un carré vide.

draw.text((10, 10), chr(1234), font=font)
  • Comment déterminer programmaticalement les glyphes manquants ?
  • Comment lister les glyphes disponibles dans un fichier ttf ?

Les deux questions sont presque identiques.

Je préférerais utiliser Pillow pour obtenir ce que je veux. D'autres modules de PyPI sont également les bienvenus.

2voto

James K Points 2794

Il existe le 'fontTools' package, qui inclut une classe python pour lire et interroger les polices TrueType. Quelque chose comme cela est possible

from fontTools.ttLib import TTFont
f = TTFont('/path/to/font/arial.ttf')
print(f.getGlyphOrder())      # une liste des glyphes dans l'ordre 
                              # où ils apparaissent
print(f.getReversedGlyphMap() # mappage des noms de glyphes aux Id
id = f.getGlyphID('Euro')     # le code interne pour le caractère Euro, 
                              # déclenche une erreur d'attribut si le caractère
                              # n'est pas présent.

Le mappage des caractères aux glyphes est souvent complexe, et est défini dans la table cmap de la police. C'est une section binaire, mais peut être inspectée avec

f.getTableData('cmap')

Une police peut avoir plusieurs tables cmap. L' interface freetype peut également lire les fichiers ttf. Il est possible d'utiliser freetype pour essayer de rendre un caractère, et voir le résultat : cela serait lent.

import freetype as ft
face = ft.Face('arial.ttf')
face.set_size(25*32)
face.load_char(‽)
bitmap = face.glyph.bitmap.buffer
if bitmap == [255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255]:
     print("Pas d'interrobang dans la police")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X