Y a t'il une facon de creer une image (java.awt.Image) ou bufferedImage a partir d'un String? merci
Y a t'il une facon de creer une image (java.awt.Image) ou bufferedImage a partir d'un String? merci
Quel est le lien entre la String et ton image :
nom de fichier ou texte à afficher ?
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) :
Apres d'autres element peuvent intervenir qui peuvent modifier la taille et le rendu de la chaine :
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();
- 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()
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.
Autre solution avec un GlyphVector :
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();
Je te conseille cet excellent article : http://java.sun.com/j2se/1.5.0/docs/guide/2d/spec/j2d-fonts.html
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);
Update : Pour dessiner la chaine il suffit de faire layout.draw(g, x, y)
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 ?
Hum pas bien reveille aujourd'hui... mais bon la doc repond directement a ma question.
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).A FontRenderContext which is directly constructed will most likely not represent any actual graphics device, and may lead to unexpected or incorrect results.
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.
La taille diffère que 0 à 2 en règle générale. Fontmetrics répond le cran le plus haut.
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);
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![]()
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.Envoyé par schneidb
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager