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

AWT/Swing Java Discussion :

Dessin d'une image dans un GeneralPath


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut Dessin d'une image dans un GeneralPath
    Bonjour,

    J'ai un petit souci.
    J'aimerai dessiner une image dans une Shape. Cette Shape est en fait un GeneralPath.
    Pour l'instant j'utilise cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g2d.setPaint(new TexturePaint(img, generalPath.getBounds2D()));
    où vous l'aurez deviné, img est mon image et generalPath est mon GeneralPath...

    J'aimerai que dans le cas où mon GeneralPath est un rectangle, l'image se dessine dans le rectangle (qui peut être tourné d'un angle alpha), et non pas dans le rectangle circonscrit à mon rectangle tourné.

    Du coup, comment puis-je faire pour savoir si mon GeneralPath est un rectangle?

    Merci d'avance!

  2. #2
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Bon en fait, je suis bête puisqu'un Rectangle est toujours droit... Si on lui applique une rotation, ça devient un GeneralPath

    Du coup, je ne peux pas faire ce que je veux, tout du moins pas avec un TexturePaint.
    Quelqu'un connaîtrait-il une autre solution pour arriver à ce que je veux?
    Siouplé...

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Le Rectangle passe en parametre du constructeur de la TexturePaint sert a indiquer les dimensions de l'image de la texture (au cas ou on veut faire une texture qui ne commence pas a (0,0) ou qui soit aggrandie/retrecie par rapport a l'image source), il n'est pas en rapport direct avec la forme dessinee a l'ecran).

    Note que la transformation utilisee affecte egalement les Paint, donc si tu utilises une TexturePaint plutot qu'une image directe, elle sera affichee dans le bon sens (voir image jointe)... si tu t'y prend correctement. Le simple fait de faire un fill() de la Shape avec ce Paint fera que la texture apparaitra a travers une "fenetre" ayant la bonne forme.

    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
    package test;
     
    import java.awt.*;
    import java.awt.geom.*;
    import java.awt.image.*;
    import java.io.*;
    import javax.swing.*;
    import javax.imageio.*;
     
    public class Test2D extends JFrame {
      public static final TexturePaint THE_PAINT = createPaint();
     
      public Test2D() {
        super("Test");
        setLayout(new BorderLayout());
        add(new RenderPanel(), BorderLayout.CENTER);
      }
     
      private static TexturePaint createPaint() {
        try {
          BufferedImage image = ImageIO.read(new File("fbavatar.png"));
          return new TexturePaint(image, new Rectangle(0, 0, image.getWidth(), image.getHeight()));
        }
        catch (Exception e) {
          e.printStackTrace();
        }
        return null;
      }
     
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            Test2D dialog = new Test2D();
            dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            dialog.setVisible(true);
            dialog.pack();
          }
        });
      }
     
      private static class RenderPanel extends JPanel {
        private static Stroke STROKE = new BasicStroke(5);
        private static Paint FILL_GRADIENT = new GradientPaint(50, 0, Color.RED, 50, 350, Color.YELLOW);
        private static Paint PAINT_GRADIENT = new GradientPaint(50, 0, Color.YELLOW, 50, 350, Color.RED);
        private Shape circle = new Ellipse2D.Float(50, 50, 350, 350);
     
        public RenderPanel() {
          super();
          setPreferredSize(new Dimension(500, 500));
        }
     
        /** {@inheritDoc}
         */
        @Override protected void paintComponent(Graphics graphics) {
          super.paintComponent(graphics);
          Graphics2D g2d = (Graphics2D) graphics.create();
          try {
            Dimension size = getSize();
            //g2d.rotate(Math.PI/2.0, size.width/2.0, size.height/2.0);
            g2d.shear(0.5, 0);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            //g2d.setPaint(FILL_GRADIENT);
            g2d.setPaint(THE_PAINT);
            g2d.fill(circle);
            g2d.setStroke(STROKE);
            //g2d.setPaint(PAINT_GRADIENT);
            g2d.draw(circle);
          }
          finally {
            g2d.dispose();
          }
        }
      }
    }
    Enfin si tu prefere manipuler des Image plutot que des TexturePaint, tu dois mettre la zone de clip du graphics2D a la forme que tu utilises (le Rectangle, le GeneralPath...) avant de dessiner ton image. Genre (code pas teste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
      g2d.setTransform(transform);
     Shape oldClip = g2d.getClip();
     g2d.setClip(shape);
     g2d.drawImage(....);
     g2d.setClip(oldClip);
     g2d.draw(shape);
     g2d.setTransform(transform.createInverse());
    }
    catch (NoninvertibleTransformException nite) {
      ...
    }
    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

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Effectivement, ta méthode fonctionne, mais manipule directement l'objet Graphics pour obtenir la rotation.

    Dans mon programme, les formes sont déformées à l'aide d'une AffineTransform. Du coup, j'ai du mal à voir comment coupler les 2...

    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
     
    public void draw(Graphics2D g2d, AffineTransform aff, Color shapeBackground, Color shapeOutline, float shapeTransparency, float shapeThickness, float[] shapeStyle, String texturePath, Color splitBackground, Color splitOutline, float splitTransparency) {
     
    	g2d.setStroke(new BasicStroke(getThickness(), BasicStroke.CAP_ROUND, 
    	BasicStroke.JOIN_MITER, 10.0f, getStyle(), 1));
    	g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getTransparency()));
     
    	Shape rat = aff.createTransformedShape(shape);
     
    	// Gestion de la texture
    	if (getTexturePath() != null && getTexturePath().length() > 0) {
    		BufferedImage img;
    		img = ImageFilesReader.read(getTexturePath());
     
    		if (img != null) {
    			g2d.setPaint(new TexturePaint(img, rat.getBounds2D()));	
    			g2d.fill(rat);
    		}
    	}
    	else {
    		g2d.setColor(new Color(getBackgroundColorCode()));
    		g2d.fill(rat);
    	}
     
    	g2d.setColor(new Color(getOutlineColorCode()));
    	g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
    	g2d.draw(rat);
    }

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    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 901
    Billets dans le blog
    54
    Par défaut
    Si tu veux que ta texture soit transformée par ta transfo, il va falloir modifier ton code.

    Par contre si j'étais toi, j'éviterai de charger l'image de la texture à chaque boucle de dessin.
    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

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par bouye
    Si tu veux que ta texture soit transformée par ta transfo, il va falloir modifier ton code.
    C'est ça le problème...
    Parce qu'en fait, la forme à dessiner peut être tournéer et/ou zoomée. Or si je veux modifier le Graphics, il aut juste que je le tourne, donc il faut que je récupère l'angle, ce qui n'est pas possible il me semble, ou alors que j'applique l'AffineTransform de la Shape au Graphics, et que j'applique l'inverse du zoom, etc...
    Ou tout changer.
    Donc à voir.

    Citation Envoyé par bouye
    Par contre si j'étais toi, j'éviterai de charger l'image de la texture à chaque boucle de dessin.
    Effectivement...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Applet: dessiner une image dans une classe
    Par accion mutante dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 24/07/2009, 22h33
  2. Peut on mettre une image dans une BD MySQL ?
    Par maddog2032 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/07/2003, 16h18
  3. Une image dans un composant ?
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 11h28
  4. [VB6] [Excel] Insérer une image dans une feuille
    Par mathias dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 09/10/2002, 07h44
  5. Réponses: 3
    Dernier message: 12/06/2002, 19h03

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