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 :

récupère une partie de BufferedImage


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut récupère une partie de BufferedImage
    J’ai une image (BufferedImage)
    et je veut récupère une partie de cette image dans une autre image pour l’afficher ailleurs
    Par exemple a partie de la premier image je veut récupère la partie encadre par le rectangle (x1,y1).(x2,y2) .(x3,y3).(x4,y4) avec x1 #x2#x3#x4 #y1#y2#y3#y4
    SVP aide moi sur ce point je suis bloque depuis hier et merci
    J’ai trouve la méthode suivante

    BufferedImage copie = image.getSubimage(x, y, largeur, hauteur);

    Mais c’est pas ce que je veut car ça répond pas a ma condition x1 #x2#x3#x4 #y1#y2#y3#y4
    Merci de me répondre

  2. #2
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Je ne vois pas pourquoi la méthode getSubimage(x, y, largeur, hauteur) ne te convient pas. Si tu as les coordonnées des 4 points de ton rectangle il est facile d'obtenir la largeur et la hauteur de celui-ci.Non???
    Exemple :
    Soit le rectangle suivant :
    x1,y1--------x2,y2



    x4,y4--------x3,y3
    Tu appelles la méthode comme ceci getSubimage(x1,y1,x2-x1,y4-y1).

    A+
    Hydraland

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    non c'est pas ce que je veut disant que c'est pas un rectange puisque
    x1 n'egale pas x4
    x3 n'esgale pas x2
    tu vois le probleme

  4. #4
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Ca se complique.
    Je te propose la solution suivante, mais je ne sais pas si cela fonctionnera.
    Il faut que tu crèes un BufferedImage de la même taille que ton image initiale, soit BI son nom. Ensuite tu recupères le Graphics de BI tu lui associes comme clip une Shape qui représente ton rectangle(Je pense que c'est facilement possible avec un GeneralPath). Ensuite tu dessines sur BI ton image initiale. Sur BI si cela marche comme je pense tu auras que la partie du rectangle dessiné. J'ai trouvé ce lien (http://www.developpez.net/forums/sho...ht=GeneralPath) sur le forum il ne parle pas exactement de ton problème mais je pense qu'il peut servir.

    Bonne chance,
    A+
    Hydraland

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par hydraland
    Ca se complique.
    Je te propose la solution suivante, mais je ne sais pas si cela fonctionnera.
    Il faut que tu crèes un BufferedImage de la même taille que ton image initiale, soit BI son nom.
    En fait, si tu veux juste recuperer le strict minimum, BI doit avoir la meme taille que la boite englobante de la zone de clip. Sinon dans l'idee c'est tout a fait ca.

    De plus BI devra supporter la transparence (BufferedImage.TYPE_INT_ARGB) surtout si la forme de clip n'est pas rectangulaire. Et enfin le resultat peut varier en fonction de certains indices de rendus qui peuvent faire que les bordures de la zone de clip, la ou l'image s'arrete, sont plus ou moins adoucies (RenderingHints.KEY_RENDERING et RenderingHints.KEY_ANTIALIASING).

    A noter que c'est assez different de getSubimage() puisque avec cette methode il n'y a pas de duplication de donnee (la sous-image partage ses pixels avec l'image source). Dans ton cas tu creeras bien une nouvelle image completement differente.
    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
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    La méthode du clip fonctionnera mais ne gérera pas l'antialiasing. Il est préférable de dessiner la shape *avec antialiasing* dans la nouvelle image, de mettre un AlphaComposite.SrcIn sur le Graphics puis de peindre l'image à clipper.

    bouye : Dans les implémentations de Sun, aucun rendering hint ne fournit d'antialiasing pour le clip, d'où la technique du SrcIn (ou SrcOut peut-être, je ne sais plus trop
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Oups merci d'avoir rectifie. A force de tester divers trucs j'ai fini par melanger tout ca.
    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

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Alors, Gfx m'ayant force a re-revoir mes acquis voici un petit test te montrant comment ca peut marcher.

    Notes :
    - le fond est rouge pour bien tester que la transparence de l'image source est bien preserve dans toutes les methodes.
    - la methodes avec une TexturePaint est a eviter je pense.

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import java.awt.geom.*;
    import javax.swing.*;
     
    public class TestClip extends JPanel implements ComponentListener, Runnable {
      public enum Method {
        NONE, CLIP, ALPHA_COMPOSITE, TEXTURE;
      }
     
      private BufferedImage subImage;
      private Ellipse2D clip = new Ellipse2D.Double();
      private Method method;
     
      public TestClip(Method method) {
        super();
        setBackground(Color.RED);
        this.method= method;
        addComponentListener(this);
      }
     
      protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (subImage != null) {
          Graphics2D graphics = (Graphics2D)g.create();    
          graphics.draw(clip.getBounds2D());
          if (subImage.getWidth() != getWidth()) {
    	graphics.translate(clip.getX(), clip.getY());
          }
          graphics.drawImage(subImage, 0, 0, null);
          graphics.dispose();      
        }
        g.drawString(method.toString(), 10, 10);
      }
     
      public void componentHidden(ComponentEvent event) {
      }
     
      public void componentMoved(ComponentEvent  event) {
      }
     
      public void componentResized(ComponentEvent  event) {
        SwingUtilities.invokeLater(this);
      }
     
      public void run() {
        int width = getWidth();
        int height = getHeight();
        //BufferedImage sourceImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        BufferedImage sourceImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        //LinearGradientPaint gradient = new LinearGradientPaint( 0, 0, width, height, new float[] {0, 1/3f, 2/3f, 1}, new Color[] {Color.WHITE, Color.CYAN, Color.BLUE, Color.BLACK});
        LinearGradientPaint gradient = new LinearGradientPaint( 0, 0, width, height, new float[] {0, 1/3f, 2/3f, 1}, new Color[] {Color.WHITE, new Color(0, 255, 255, 0), Color.BLUE, Color.BLACK});
        Graphics2D graphics = sourceImage.createGraphics();
        graphics.setPaint(gradient);
        graphics.fillRect(0, 0, width, height);
        graphics.dispose();    
        if (method == Method.NONE) {
          subImage = sourceImage;
          clip.setFrame(0, 0, width, height);
        }
        else {
          clip.setFrameFromCenter(width/2.0, height/2.0, 10, 10);
          subImage = new BufferedImage((int)Math.ceil(clip.getWidth()), (int)Math.ceil(clip.getHeight()), BufferedImage.TYPE_INT_ARGB);    
          graphics = subImage.createGraphics();
          graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
          graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          graphics.translate(-clip.getX(), -clip.getY());
          switch (method) {
          case ALPHA_COMPOSITE: {
    	graphics.setColor(Color.WHITE);
    	graphics.fill(clip);
    	graphics.setComposite(AlphaComposite.SrcIn);
    	graphics.drawImage(sourceImage, 0, 0, null);
          }
    	break;
          case TEXTURE: {
    	graphics.setPaint(new TexturePaint(sourceImage, new Rectangle(width, height)));
    	graphics.fill(clip);
          }
    	break;
          case CLIP:
          default: {
    	graphics.setClip(clip);
    	graphics.drawImage(sourceImage, 0, 0, null);
          }
          }
          graphics.dispose();
        }
        repaint();
      }
     
     
      public  void componentShown(ComponentEvent  event) {
      }
     
      public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
    	public void run() {
    	  TestClip[] testClips = new TestClip[4];
    	  testClips[0]= new TestClip(Method.NONE);
    	  testClips[1]= new TestClip(Method.CLIP);
    	  testClips[2]= new TestClip(Method.ALPHA_COMPOSITE);
    	  testClips[3]= new TestClip(Method.TEXTURE);
    	  JFrame frame = new JFrame("Test");
    	  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	  frame.setLayout(new GridLayout(testClips.length/2, testClips.length/2));
    	  for (TestClip testClip : testClips ) {
    	    frame.add(testClip);
    	  }
    	  frame.setSize(500, 600);
    	  frame.setVisible(true);
    	}
          });
      }
    }
    Images attachées Images attachées  
    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

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    salut bouye
    j'ai essai de compiler ton exemple sur mon pc
    mais ça marche pas ce me donne les erreurs suivantes:

    C:\TestClip.java:8: ';' expected
    public enum Method {
    ^
    C:\TestClip.java:108: ';' expected
    for (TestClip testClip : testClips ) {
    ^
    C:\TestClip.java:113: illegal start of expression
    }
    ^
    et j'ai pas compris pourquoi ça marche
    j'utilisé jdk 4

  10. #10
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par nonosa
    salut bouye
    j'ai essai de compiler ton exemple sur mon pc
    mais ça marche pas ce me donne les erreurs suivantes:

    C:\TestClip.java:8: ';' expected
    public enum Method {
    ^
    C:\TestClip.java:108: ';' expected
    for (TestClip testClip : testClips ) {
    ^
    C:\TestClip.java:113: illegal start of expression
    }
    ^
    et j'ai pas compris pourquoi ça marche
    j'utilisé jdk 4
    Installes un JDK 5 ou même 6 tant que tu y es , les enum et la boucle foreach n'étant disponible qu'à partir de java 5
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Sinon pour une compatibilite 1.4- :
    -chacune des enum peut etre remplacee par une constante entiere statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      public enum Method {
        NONE, CLIP, ALPHA_COMPOSITE, TEXTURE;
      }
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public static final int NONE = 0;
     public static final int CLIP = 1;
     public static final int ALPHA_COMPOSITE = 2;
     public static final int TEXTURE = 3;
    Et enlever le Method. aux endroits ou il y en a.

    - le foreach peut etre remplace par un for normal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	  for (TestClip testClip : testClips ) {
    	    frame.add(testClip);
    	  }
    =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	  for (int i = 0 ; i < testClips.lenght ; i++ ) {
    	    frame.add(testClips[i]);
    	  }
    Je te conseille cependant la methode de Sinok, sauf ti tu ne peux pas changer de version de Java pour une raison particuliere.

    Heureusement que je n'avais pas mis d'annotion dans le code moi.
    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

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    salut
    boye merci pour ta reponse mais j'ai encore une question pour toi

    j' arrive pas a executer ton exemple j'ai encor une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    location: class TestClip
        LinearGradientPaint gradient = new LinearGradientPaint( 0, 0, width, height, new float[] {0, 1/3f, 2/3f, 1}, new Color[] {Color.WHITE, new Color(0, 255, 255, 0), Color.BLUE, Color.BLACK});
     
    C:\123456\TestClip.java:56: cannot resolve symbol
    symbol  : class LinearGradientPaint 
    location: class TestClip
        LinearGradientPaint gradient = new LinearGradientPaint( 0, 0, width, height, new float[] {0, 1/3f, 2/3f, 1}, new Color[] {Color.WHITE, new Color(0, 255, 255, 0), Color.BLUE, Color.BLACK});
     
    2 errors
    j'ai change ton code pour que je puisse l'executer sur java 1.4 comme tu ma dit
    mais je pense quel manque la classe LinearGradientPaint gradient dans ton code
    svp repond moi et merci d'avance

  13. #13
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    LinearGradientPaint est une classe de java 1.6.

    Il te faudra décomposer ce gradient en plusieurs GradientPaint (un GradientPaint correspond à un gradient entre deux couleurs).

    Dans le cas présent je dirais 3 GradientPaint:
    • Blanc vers Rouge
    • Rouge vers Bleu
    • Bluea vers Noir
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    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 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Plutot que du rouge c'est une couleur transparente (du cyan en fait), c'est le panel qui a un fond rouge. Pas la peine de t'embeter a faire plusieurs gradient, un seul suffit, c'est juste pour le test.
    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

Discussions similaires

  1. [XL-2007] Récupéré une partie de mon url
    Par diltech dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/08/2010, 06h49
  2. [MySQL] recuperer une partie de la chaine récupérée aprés d'aprés une requête MySQL
    Par bourbita.thameur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/06/2009, 13h15
  3. [OpenSceneGraph]Récupéré une partie de la scene
    Par GrooveRage dans le forum OpenSceneGraph
    Réponses: 20
    Dernier message: 23/02/2008, 14h48
  4. Comprendre comment on récupère une partie d'une chaine
    Par nicolas2603 dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/02/2008, 15h02
  5. récupéré une valeur de resource à partie d'une action
    Par florentB dans le forum Struts 1
    Réponses: 3
    Dernier message: 09/10/2007, 12h01

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