Font / GlyphVector : étirer une chaîne dans un rectangle

Font / GlyphVector : étirer une chaîne dans un rectangle - Java - Programmation

Marsh Posté le 03-02-2005 à 22:48:48    

J'essaye d'afficher une chaîne de caractère sur un Graphics2D avec une police de base, de manière à ce que la chaîne affichée rentre parfaitement dans un rectangle.
 
Pour l'instant, je convertis la chaîne en GlyphVector, je regarde la taille, je fais un rapport, je calcule une transformation, et je crée une nouvelle font.
 
La taille est parfaite, mais j'ai un problème de décalage, en effet quand je récupére la taille du GlyphVector, je n'ai pas l'espacement de la première lettre par rapport à l'extrême gauche, donc la chaîne fait la taille du rectangle mais est décalée.
 
Je voulais savoir si y'en a qui ont déjà fait un truc du genre, et si oui, si il y avait plus simple et/ou plus précis.
 


GlyphVector gv=getFont().createGlyphVector(frc,texte.toCharArray());
Rectangle box = gv.getOutline().getBounds();
 
AffineTransform trans = new AffineTransform();
trans.scale(largeur/box.getWidth(),hauteur/box.getHeight());
 
Font phont2 = getFont().deriveFont(trans);
graph.setFont(phont2);
graph.drawString(texte,x,y+hauteur);


 
genre là avec le i de Arial, j'ai un mega décalage (propotionnel à la taille de la police)


Message édité par raytaller le 03-02-2005 à 22:49:02
Reply

Marsh Posté le 03-02-2005 à 22:48:48   

Reply

Marsh Posté le 04-02-2005 à 12:23:29    

En utilisant graphics.getFontMetrics().getHeight(), tu peux déterminer la largeur du texte dans la fonte courante.
 
Je sais pas si ça t'aide...


Message édité par machinbidule1974 le 04-02-2005 à 12:23:42
Reply

Marsh Posté le 04-02-2005 à 18:37:24    

en effet c'est plus simple, mais le problème c'est que :
 
 


si on zoome sur les lettres, on remarque des espaces autour  
 
"    B      o     n         j        o       u        r    "
 
 <-------la vraie boîte prends cette taille--------------->
     <--------getHeight() me retourne celle là-------->
 


 
ce qui fait que quand je dessine la chaîne, l'origine en x n'est pas en l'occurence exactement le début du "B" mais quelques pixels avant.  
Le problème c'est qu'en corps de texte 200, les quelques pixels, en fonction des lettres (le pire c'est i je crois) bah c'est pas négligeable
 
 
je voudrais juste faire une sorte de fitRectangle, mais précis, au pixel près.

Reply

Marsh Posté le 04-02-2005 à 19:07:04    

J'ai parlé de getHeight() mais je voulais dire getWidth(), tu l'auras compris...
 
Y'aurait pas un problème d'arrondi quand tu calcules le facteur de scaling ? Besoin de caster en float les largeurs avant de calculer les ratio... ?


Message édité par machinbidule1974 le 04-02-2005 à 19:07:47
Reply

Marsh Posté le 04-02-2005 à 21:13:38    

bah c'est pourtant ce que je fais... je cast tout en float

Reply

Marsh Posté le 06-02-2005 à 12:43:01    

gagné  :bounce:  :
 


 
GlyphVector gv=getFont().createGlyphVector(frc,texte.toCharArray());
Shape outline = gv.getOutline();
Rectangle2D mb=gv.getVisualBounds();
 
AffineTransform sav=graph.getTransform();
 
AffineTransform tras = new AffineTransform();
double minscale=Math.min(largeur/mb.getWidth(),hauteur/mb.getHeight());
 
tras.scale(minscale,minscale);
tras.translate(-mb.getMinX(),mb.getHeight());
 
tras.translate((x+(largeur-mb.getWidth()*minscale)*0.5)/minscale,
  (y+(hauteur-mb.getHeight()*minscale)*0.5)/minscale);
   
graph.setTransform(tras);
graph.fill(outline);
graph.setTransform(sav);
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed