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

Interfaces Graphiques en Java Discussion :

Espace commun entre plusieurs glyph


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Espace commun entre plusieurs glyph
    Bonjour à tous,

    Je cherche depuis quelques temps comment afficher dans une BufferedImage plusieurs glyphs représentant des caractères différents (UTF8) séparés par un même espace.
    Je précise que je ne souhaite pas utiliser drawChars ou tout autre manière "gérée" d'afficher mes caractères.

    Voici le code qui ne marche pas. Si vous avez des pistes je suis preneur !

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics2D;
    import java.awt.font.FontRenderContext;
    import java.awt.font.GlyphVector;
    import java.awt.font.TextLayout;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
     
     
    import javax.swing.JFrame;
    import javax.imageio.ImageIO;
     
    import ci.util.graphic.UtilGraphic;
     
    public class Test {
     
    	public static void main(String[] args) {
     
    		FontRenderContext frc = new FontRenderContext(null, false, false);
    		Font font = new Font("Serif", Font.PLAIN, 24);
    		char[] tc = {'f', 'g', '@', '£'};
    		Rectangle2D bounds;
     
    		double ascent;
    		double descent;
     
    		BufferedImage img = new BufferedImage(500, 600, BufferedImage.TYPE_INT_RGB);
    		img.createGraphics();	
    		Graphics2D g = (Graphics2D)img.getGraphics();
    		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                    g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     
     
     
    		int xPos = 10;
    		int yPos = 50;
     
    		int curr_pos=xPos;
     
    		for(int i=0 ; i< 4 ; i++)
    		{
     
    			TextLayout layout = new TextLayout(""+tc[i], font, frc);
    			bounds = layout.getBounds();
     
    			ascent = -bounds.getY(); 
    			descent = bounds.getHeight()+bounds.getY(); 
    			stretchingCapacity = 0;
     
    			String tcS = Character.toString(tc[i]);
     
    			// get metrics from the graphics
    		        FontMetrics metrics = g.getFontMetrics(font);
    		        // get the height of a line of text in this font and render context
    		        int hgt = metrics.getHeight();
    		        // get the advance of my text in this font and render context
    		        int adv = metrics.stringWidth(tcS);
    		        // calculate the size of a box to hold the text with some padding.
    		        Dimension size = new Dimension(adv+2, hgt+2);
     
    			GlyphVector gv = font.createGlyphVector(frc, tcS);
     
    			Rectangle2D r2 = gv.getVisualBounds();		
     
    			g.drawGlyphVector(gv,(float)curr_pos ,yPos);
     
    			int fixedSpace = 5;  
     
    			curr_pos+= size.width + fixedSpace;
     
    		}
     
    		render(img,500, 500);
    	}
     
     
     
    	public static void render (BufferedImage img, int sizeW, int sizeH) {
     
    		JFrame frame = new JFrame("Image Maker");
    		frame.setBounds(0, 0, sizeW, sizeH);
     
    		JImagePanel panel = new JImagePanel(img, 0, 0);
     
    		frame.add(panel);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    		frame.setVisible(true);
     
     
    	}	
    }

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Pouah qu'est ce que le rendu est dégueulasse avec drawGlyphVector()

    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
     
    //UtilGraphic.initBetter(g);
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     
    [...]
     
            // Test avec drawGlyphVector()
     
    [...]
     
            // Test avec drawString()
            g.setFont(font);
            String s = new String(tc);
            g.drawString(s, xPos, 100);
     
            // Test avec draw()
            GlyphVector gv = font.createGlyphVector(frc, tc);
            g.translate(xPos, 200);
            for (int i = 0; i < 4; i++) {
                Shape shape = gv.getGlyphOutline(i);
                g.fill(shape);
            }
    Tien essaie de placer chacune des Shape aux emplacement corrects maintenant en tenant compte de sa position d'origine.

    PS : le rendu bien que beaucoup mieux qu'avec drawGlyphVector() ne semble pas 100% identique à drawString(). J'me demande si faudrait pas faire un draw() avec un Stroke de 0.5 également.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Je te remercie de ta réactivité !
    Je vais tester ta méthode et je reviens avec les résultats dès que j'ai terminé !

    EDIT: J'ai testé ta méthode avec succès sur les caractères normaux. Mais le problème reste avec les changements de style de font ou les caractères spéciaux
    Images attachées Images attachées  

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Voila le code que j'ai utilisé.
    Je ne veux pas considérer le tableau de char en tant que phrase
    donc je ne peux pas me fier à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    font.createGlyphVector(frc, tc);
    C'est peut-être de la d'où vient le problème non ?

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    FontRenderContext frc = new FontRenderContext(null, false, false);
    		Font font = new Font("Serif", Font.ITALIC, 24);
    		char[] tc = {'f','¥', '水', '@', '£','ф'};
    		Rectangle2D bounds;
     
    		BufferedImage img = new BufferedImage(500, 600, BufferedImage.TYPE_INT_RGB);
    		img.createGraphics();	
    		Graphics2D g = (Graphics2D)img.getGraphics();
    		UtilGraphic.initBetter(g);
     
    		int xPos = 0;
    		int yPos = 50;
     
    		int curr_pos=xPos;
     
    //        // Test avec drawString()
            g.setFont(font);
            String s = new String(tc);
            g.drawString(s, xPos, 100);
     
            // Test avec draw()
     
            g.translate(0, 150);
            for (int i = 0; i < 6; i++) {
     
                if(i%3==0) {font = new Font("Serif", Font.ITALIC, 24);}
                else {font = new Font("Serif", Font.BOLD, 24);}
                GlyphVector gv = font.createGlyphVector(frc, String.valueOf(tc[i]));
     
                Shape shape = gv.getGlyphOutline(0);
     
                g.translate(20, 0);
                g.fill(shape);  
            }

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/07/2008, 23h04
  2. Communication entre plusieurs bases Access
    Par Jordmund dans le forum Access
    Réponses: 1
    Dernier message: 09/04/2008, 17h16
  3. Communication entre plusieurs fenetres
    Par tom42 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 03/03/2008, 17h49
  4. paramètres communs entre plusieurs html
    Par j.p.mignot dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/01/2008, 16h45
  5. Communication entre plusieurs applications.
    Par granquet dans le forum Linux
    Réponses: 9
    Dernier message: 01/06/2006, 14h42

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