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

2D Java Discussion :

transformer une chaine de caracteres en image


Sujet :

2D Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut transformer une chaine de caracteres en image
    Y a t'il une facon de creer une image (java.awt.Image) ou bufferedImage a partir d'un String? merci

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Quel est le lien entre la String et ton image :
    nom de fichier ou texte à afficher ?

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    S'il s'agit de stocker le rendu d'une chaine de charactere dans une image oui c'est possible. Encore que tu vas tomber sur un "serpent qui se mort la queue".

    Pour creer une image a la bonne taille tu as besoin de la taille de la boite englobante de la chaine de caracteres.
    Pour connaitre la boite englobante de la chaine de caractere tu as besoin d'un contexte graphique (et donc d'une image ou d'un composant graphique).

    Enfin, bon je ne suis pas contre une idee sur ce pb (Gfx ?).

    Mais une fois ton graphics obtenu tu peux faire quelque choise qui ressemble a ca (pas teste et je n'ai pas mon livre de Java2D sous la main) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BufferedImage image = ...
    Graphics2D graphics = image.createGraphics();
    graphics.setFont(font);
    graphics.setPaint(paint);
    graphics.setStroke(stroke);
    graphics.setRenderingHints(...
    ...
    FontRenderContext renderContext = graphics.getFontRenderContext();
    Rectangle2D bounds = font.getStringBounds(label, renderContext);
    LineMetrics lineMetrics = font.getLineMetrics(label, renderContext);
    graphics.drawString(label, (float)bounds.getX(), (float)(bounds.getY()+lineMetrics.getAscent()));
    graphics.dispose();
    Apres d'autres element peuvent intervenir qui peuvent modifier la taille et le rendu de la chaine :
    - la police (bien sur)
    - l'antialiasing sur le texte
    - la transformation actuelle appliquee au graphics.

    Tu peux aussi faire que le stroke s'applique a la chaine en transformant les glyphes de la chaine en Shape et en dessinant cette forme, plutot que d'utiliser la methode drawString()

  4. #4
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Il y a plein de manieres d'obtenir la taille de la boite englobante d'une chaine de caracteres. Certaines sont plus precises mais plus lentes que les autres. Je conseille d'utiliser un objet TextLayout qui donne des resultats suffisamment precis et qui permet d'obtenir l'ascent et le descent de la chaine, ainsi que l'interlignage, etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FontRenderContext context = getFontMetrics(textFont).getFontRenderContext();
    TextLayout layout = new TextLayout(text, textFont, context);
    Rectangle bounds = layout.getBounds();
    Autre solution avec un GlyphVector :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GlyphVector vector = textFont.createGlyphVector(context, text);
    Rectangle bounds = vector.getPixelBounds(context, 0.0f, 0.0f);
    Je te conseille cet excellent article : http://java.sun.com/j2se/1.5.0/docs/guide/2d/spec/j2d-fonts.html

    Update : Pour dessiner la chaine il suffit de faire layout.draw(g, x, y)

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    Cool merci pour le conseil sur TextLayout.

    EDIT - dans le cas ou l'on travaille dans un envirronement non-graphique cela change-til quoi que ce soit d'instancier son propre FontRenderContext plutot que de reutiliser celui fournis par un composant ou un graphics quelconque ?

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 851
    Points : 22 863
    Points
    22 863
    Billets dans le blog
    51
    Par défaut
    Hum pas bien reveille aujourd'hui... mais bon la doc repond directement a ma question.

    A FontRenderContext which is directly constructed will most likely not represent any actual graphics device, and may lead to unexpected or incorrect results.
    Ce qui me fait retomber sur mon probleme cyclique... A part creer une image temporaire de taille 1x1 juste pour pouvoir recuperer son Graphics2D, je ne vois pas trop comment faire (toujours dans l'optique d'un programme/API independant d'une GUI).

  7. #7
    Membre actif Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Points : 240
    Points
    240
    Par défaut
    J'ai parcouru pas mal de réponses sur le forum, voila ce que j'en tire:

    Pour comparer les différentes approches utilisant FontMetrics ou TextLayout.

    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
     
     
    int width = 1;
    		int height = 1;
     
    		BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
     
     
    		Graphics2D g = (Graphics2D)bImage.getGraphics();
     
    		FontMetrics fMetrics = g.getFontMetrics(f);
     
    		int strWidth = fMetrics.stringWidth(txtToDisplay);
     
    		int widthLayout = 0;
    		if ( txtToDisplay.length() > 0)
    		{
    			TextLayout layout = new TextLayout(txtToDisplay, f, g.getFontRenderContext());
    			widthLayout = (int)layout.getBounds().getWidth();
    		}
     
    		System.out.println("strWidth FontMetrics=" + strWidth);
    		System.out.println("strWidth Layout=" + widthLayout);
    La taille diffère que 0 à 2 en règle générale. Fontmetrics répond le cran le plus haut.
    Reste un détail: qu'une exception est générée quand la taille du texte égale 0 sur le textLayout alors qu'avec fontMetrics non.

    voila si vous avez des commentaires

  8. #8
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Citation Envoyé par schneidb
    voila si vous avez des commentaires
    J'ai deux commentaires : Gfx a mentionné une méthode utilisant un GlyphVector, tu l'as testée ? A part ça, la FAQ ne mentionne qu'une seule méthode, si il y a quelqu'un de motivé et disponible, il peut l'enrichir.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/01/2009, 13h37
  2. transformer une chaine de caractere en liste
    Par neo666 dans le forum Caml
    Réponses: 17
    Dernier message: 26/08/2008, 15h57
  3. Réponses: 1
    Dernier message: 13/06/2007, 13h14
  4. Réponses: 14
    Dernier message: 01/03/2006, 08h32
  5. transformer une chaine de caracteres en du code
    Par giova_fr dans le forum C++
    Réponses: 6
    Dernier message: 15/01/2006, 16h37

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