IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques tierces Python Discussion :

Module ImageFont - Taille de la zone écrite [Python 3.X]


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 57
    Points
    57
    Par défaut Module ImageFont - Taille de la zone écrite
    Bonjour,

    Mes recherches en lignes sont restées vaines sur le sujet que j'expose ci-dessous, peut-être aurai-je plus de chance sur ce site:

    Mon objectif est de connaître la taille de la zone occupée par un texte écrit dans une police donnée. Lorsque ce texte tient en une seule ligne la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageFont.truetype(..).getbbox(mon_texte)
    fait parfaitement le job. Il y a problème lorsque le texte doit s'étirer sur plusieurs lignes.
    L'exemple ci-dessous illustre ma question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    texte = "Extrait de: The Zen of Python, by Tim Peters. Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!"
    wrapped_lines = textwrap.wrap(texte,width=40) # Par défaut width = 70 caractères
    wrapped_lines = "\n".join(wrapped_lines)
    fonte_ttf = "arial.ttf"
    fonte= str(rep_font / fonte_ttf)
    size = 20
    police = ImageFont.truetype(fonte, size = size)
    left, top, right, bottom = police.getbbox(str(wrapped_lines))
    w = right - left
    h = bottom - top
    print(w,h,str(wrapped_lines))
    La dimension retournée pour la zone d'écriture est longue de la totalité des caractères du texte wrapped_lines et haute d'une seul ligne.
    Je ne sais pas si le module ImageFont est le module approprié pour cette question ou si je ne connais pas une de ses fonctionnalités qui permettraient de la traiter. Peut-être faut-il avoir recours à un autre module ?

    Quelqu'un a-t-il une idée ?

    Merci d'avance.

    CAPLANDE

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    À mon sens la seule solution est de séparer chaque ligne, et de faire la somme des tailles occupées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    w_total, h_total = 0, 0
    for line in wrapped_lines:
        left, top, right, bottom = police.getbbox(line)
        w_total += right - left
        h_total += bottom-top
    un truc dans ce style, mais comme je ne connais pas suffisamment PIL, peut-être qu'une méthode existe pour faire mieux !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Caplande Voir le message
    Quelqu'un a-t-il une idée ?
    Si vous utilisez Pillow 8.0+, il serait peut être judicieux d'essayer ImageDraw.textbbox (qui appelle multiline_textbbox s'il rencontre des fins de lignes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2011
    Messages : 45
    Points : 57
    Points
    57
    Par défaut La solution
    Citation Envoyé par wiztricks Voir le message
    Si vous utilisez Pillow 8.0+, il serait peut être judicieux d'essayer ImageDraw.textbbox (qui appelle multiline_textbbox s'il rencontre des fins de lignes.

    - W
    Merci wiztricks, tout ceci fonctionne à merveille. Ci-dessous un extrait du script que j'ai construit pour tester votre suggestion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    img = Image.new(mode='RGB', size=(1024, 256), color='#ffaa00')
    texte = "Extrait:The Zen of Python, by Tim Peters. Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!"
    texte_replie = wrapped_data = textwrap.fill(texte)
    fonte_ttf = 'arial.ttf'
    fonte = str(rep_font / fonte_ttf)
    draw = ImageDraw.Draw(img)
    size = 10
    police = ImageFont.truetype(fonte, size = size) 
    draw.multiline_text((10,10),texte_replie, fill='black', anchor='la', font=police,stroke_width=1)
    left, top, right, bottom = draw.multiline_textbbox((10,10),texte_replie, anchor='la', font=police,stroke_width=1)
    img.show()
    w = right - left
    h = bottom - top

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille d'une zone de texte dans un état sous Access 2003
    Par Petite grenouille dans le forum Contribuez
    Réponses: 4
    Dernier message: 15/05/2006, 19h39
  2. Connaitre la taille de la zone de travail
    Par kivan666 dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 12/04/2006, 15h41
  3. taille d'une zone de saisie
    Par somatino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 05/04/2006, 17h40
  4. Réponses: 9
    Dernier message: 13/04/2005, 10h15
  5. [JFrame] taille de la zone editable
    Par miel_pops dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/06/2004, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo