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

Python Discussion :

Fabriquer des word clouds


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Fabriquer des word clouds
    Bonjour,
    je voudrais créer un module qui fabriquerait des "word clouds" comme on peut en voir ici. Au passage, ce site propose ici une applet Java pour créer ses "word clouds".

    Avec PIL, cela devrait se faire et j'avais déjà posé des questions à ce propos. Avez-vous des idées pour faire un tel module ? Il devrait y avoir différents modes de construction, et si l'on souhaite éviter le plus possible les espaces vides, cela devrait se compliquer un peu.

    Pour commencer, il faudrait arriver à connaître les coordonnées du rectangle minimal contenant une lettre mise dans une image avec PIL. Les lettres "p" et "m", avec la même mise en forme, auront deux boîtes de tailles différentes.

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    dans le module ImageDraw il y a une méthode textsize qui permet de connaître la taille d'un texte sans le dessiner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    textsize
     
    draw.textsize(string, options) => (width, height)
     
    Return the size of the given string, in pixels.
     
    The font option is used to specify which font to use. It should be an instance of the ImageFont class, typically loaded from file using the load method in the ImageFont module.

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Merci.

    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #! /usr/bin/env python
    #coding=utf-8
     
    # Source :
    #    http://www.pythonware.com/library/pil/handbook/imagedraw.htm
    import Image, ImageDraw
     
    # Creation of an empty picture.
    im = Image.open("lena.png")
     
    # Infos about text.
    draw = ImageDraw.Draw(im)
     
    print draw.textsize('p')
    print draw.textsize('m')
    Cela me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Traceback (most recent call last):
    ...
      File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PIL-1.1.7-py2.6-macosx-10.3-fat.egg/Image.py", line 1952, in open
        fp = __builtin__.open(fp, "rb")
    IOError: [Errno 2] No such file or directory: 'lena.png'
    Pourtant dans la FAQ, il y a un exemple de création d'une image ex-nihilo ici, il me semble.

    Où est l'erreur ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    pygame aussi ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from pygame import *
    font.init()
     
    fontsize = 25
    text = 'foo'
     
    systemfont = font.Font(font.get_default_font(),25)
    size = systemfont.size(text)

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par rambc Voir le message
    im = Image.open("lena.png")
    N'est-ce pas plutôt Image.new que tu devrais utiliser ? C'est ce que je lis dans la FAQ en tout cas.

  6. #6
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    N'est-ce pas plutôt Image.new que tu devrais utiliser ? C'est ce que je lis dans la FAQ en tout cas.
    Oups... J'ai un peu honte...

    Bon j'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #! /usr/bin/env python
    #coding=utf-8
     
    import Image, ImageFont, ImageDraw
    import pygame
     
    print '=== PIL - textsize ===' 
    im = Image.new("RGB", (1,1))
    draw = ImageDraw.Draw(im)
    font = ImageFont.load_default()
    print draw.textsize('p', font)
    print draw.textsize('m', font)
     
    print '=== PIL - font.getsize ===' 
    print font.getsize('p')
     
    print '=== PyGame ===' 
    pygame.font.init()
    fontName = pygame.font.get_default_font()
    fontsize = 25
    systemfont = pygame.font.Font(fontName, fontsize)
    print systemfont.size('p')
    print systemfont.size('m')
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    === PIL - textsize ===
    (6, 11)
    (6, 11)
    === PIL - font.getsize ===
    (6, 11)
    === PyGame ===
    (15, 26)
    (22, 26)
    On voir donc que rien n'est parfait :
    • ImageFont et ImageDraw renvoient la même info...
    • PyGame est précis sur la largeur mais excessif sur la hauteur...

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    ben, normal, avec pygame faut donner la hauteur de la font.
    j'ai mis 25 arbitrairement ...

    mets:
    et tu obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    === PIL - textsize ===
    (6, 11)
    (6, 11)
    === PIL - font.getsize ===
    (6, 11)
    === PyGame ===
    (6, 11)
    (9, 11)

Discussions similaires

  1. Fabriquer des états / reports ?
    Par patxi.draks dans le forum Général Python
    Réponses: 2
    Dernier message: 28/05/2008, 15h47
  2. Fabriquer des formulaires sur Oracle
    Par mlaiti dans le forum Forms
    Réponses: 4
    Dernier message: 25/02/2008, 17h52
  3. TmemoryStream: definition des Word
    Par cfalcot dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2006, 18h46
  4. Fabriquer des requêtes sql à partir d'un document xml
    Par ktel dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 18/10/2005, 16h45

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