Selectionner partie d'une image

cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016 - 26 mai 2008 à 17:00
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016 - 27 mai 2008 à 16:02
Salut,
Je cherche comment faire une zone sélectionnable en JAVA. J'ai une image qui s'affiche dans mon applet avec la méthode g.drawImage() etc.. et je voudrais pouvoir rogner cette image. J'ai trouver la méthode pour rogner l'image avec CropImageFilter mais je cherche maintenant comment pouvoir selectionner une partie de l'image et que cela enregistre les coordonnées ?

Merci

Florent

14 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 mai 2008 à 13:55
Salut,
bon vu que de toutes façons ça va se finir comme ça ^^, voici un
code d'exemple pour une sélection (sur image ou non), le code ne traite
pas la découpe de l'image donc il faudra que tu le gère toi même :

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class TestSelection extends JComponent implements MouseListener,
        MouseMotionListener {

    private static final long    serialVersionUID    = 7774248752982522933L;
    private BufferedImage        image                = null;
    private Point                porig                = null;
    private Point                pmove                = null;

    public static void main(final String... args) {
        final JFrame f = new JFrame("Selection Demo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800, 600);
        f.setLocationRelativeTo(null);
        try {
            f.setContentPane(new TestSelection(new File("image.jpg")));
        } catch (final IOException e) {
            e.printStackTrace();
        }
        f.setVisible(true);
    }

    public TestSelection(final File image) throws IOException {
        this.image = ImageIO.read(image);
        porig = null;
        pmove = null;
        // ajout des listeners
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        final Graphics2D g2 = (Graphics2D) g;
        if (image != null) {
            // dessine l'image en haut à gauche
            // fleme de faire mieux
            g2
                    .drawImage(image, 0, 0, image.getWidth(),
                            image.getHeight(), this);
        }
        if (pmove != null && porig != null) {
            g2.setColor(Color.BLACK);
           
            // calcul de la selection
            final Rectangle rect = new Rectangle((pmove.x > porig.x) ? porig.x : pmove.x,
                            (pmove.y > porig.y) ? porig.y : pmove.y,
                            (pmove.x > porig.x) ? pmove.x - porig.x : porig.x
                                    - pmove.x, (pmove.y > porig.y) ? pmove.y
                                    - porig.y : porig.y - pmove.y);
            // dessine le fond de la selection avec un effet de transparence
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .2f));
            g2.fillRect(rect.x, rect.y, rect.width, rect.height);
            // suppression de la transparence pour dessiner la bordure
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
            g2.drawRect(rect.x, rect.y, rect.width, rect.height);
        }
    }

    public void mousePressed(final MouseEvent e) {
        porig = e.getPoint(); // récupération du point d'origine
        // repaint du composant
        repaint();
    }

    public void mouseReleased(final MouseEvent e) {
        // cleanup de l'affichage, mais tu peux faire la découpe ici
        pmove = null;
        porig = null;
        // repaint du composant
        repaint();
    }

    public void mouseDragged(final MouseEvent e) {
        pmove = e.getPoint(); // récupération du point en déplacement
        // repaint du composant
        repaint();
    }

    public void mouseClicked(final MouseEvent e) { }
    public void mouseEntered(final MouseEvent e) { }
    public void mouseExited(final MouseEvent e) { }
    public void mouseMoved(final MouseEvent e) { }
}

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
4
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
26 mai 2008 à 17:39
Salut,

utilise un MouseListener (voir en plus un MouseMotion) sur le composant qui contient l'image et dans les méthodes listener tu recup les coordonnées  et fait ton ptit boulot avec CropImageFilter

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
26 mai 2008 à 18:04
Ok merci je vais reagrder cela de plus près mais est ce que quand l'utilsiateur restera cliqué la zone s'affichera pour qu'il voit ce qu'il selectionne quand même ?

Florent
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
26 mai 2008 à 18:56
Salut,

bah c'est toi qui code le truc donc si tu veux que ça reste affiché ou non c'est toi c'est à toi de voir...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 10:14
Ouai mais dans mon cas je dessine mon image avec :
g.drawImage(monImage, 100, 100, largeurFin, hauteurFin, this); // on dessine l'image
Mais il n'est pas possible de faire g.addMouseMotionListener() ou autre on ne peut pas lui mettre d'ecouteur comment faire alors ?

Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 mai 2008 à 10:24
Salut,

comme dit plus haut :

"utilise un MouseListener (voir en plus un MouseMotion) sur le composant
qui contient l'image et dans les méthodes listener tu recup les
coordonnées  et fait ton ptit boulot avec CropImageFilter"

soit le composant dans le quel tu ajoutes ou dessine l'image....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 12:18
C'est bon j'ai bien réussi mais comment faire pour que la zone que sélectionne l'utilisateur soit encadrée un peu comme dans un logiciel graphique car je ne trouve pas comment faire ?
Merci

Florent
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 mai 2008 à 12:51
Salut,

dessine un encadré pour représenter la selection...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 13:06
Cest vague ...
Explique moi un peu plus genre avec quelle méthode, comment faire pour qu'il bouge en même temps que l'on bouge la souris etc...

Merci

Florent
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 14:42
Merci beaucou je en commenaçnt à lire ton code je me suis simplement rendu comtpe que je n'avais pas ajouté l'écouteur MouseMotionListener voila pourquoi cela ne marchait pas merci à toi

Florent
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 14:45
Derniere question là si je rétrécie mon rectangle celui d'avant reste affiché comment fair ?

Florent
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
27 mai 2008 à 14:48
Salut,

ça dépend de ce que tu as fait...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 14:57
Dès qu'il rentre dans le mouseDragged une variable se met à true et cela relance la methode paint() ainsi  g.drawRect(xDebut, yDebut, (xFin-xDebut), (yFin-yDebut)); donc par exemple je clic avec la souris et je reste appuyé je fais un carré grand et au final toujours en restant cliqué je diminue le carré et bien sur mon applet le carré ne se diminue pas car l'autre plus grand reste toujours affiché.

Florent
0
cs_flolag Messages postés 113 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 12 août 2016
27 mai 2008 à 16:02
Par rapport à ton code voici ce que j'ai mis
PS : Le problème vient peut etre du fait que moi c'est une applet pas une application :

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JApplet;

public class Test extends JApplet implements MouseListener, MouseMotionListener{

    /**
     *
     */
    private static final long serialVersionUID = 6119368348214439013L;
    int xDebut;
    int yDebut;
    int xFin;
    int yFin;
    Point pFin = null;
    Point pDebut = null;
   
    BufferedImage monImage;
    boolean SourisTrainee;
   
    int xDebutSavePrSuppr;
    int yDebutSavePrSuppr;
    int wSavePrSuppr;
    int hSavePrSuppr;
   
       
    public void init() {
        this.getContentPane().setSize(800, 600);
        this.getContentPane().setBackground(Color.green);       
        this.getContentPane().addMouseListener(this);
        this.getContentPane().addMouseMotionListener(this);
        Cursor monCurseur = new Cursor(1);
        this.getContentPane().setCursor(monCurseur);
        SourisTrainee = false;
       
       
        try {
            monImage = ImageIO.read(new File("C:/essai.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
               
        }

    public void paint(final Graphics g) {
        final Graphics2D g2 = (Graphics2D) g;
       
       
        System.out.println(SourisTrainee);
         if (pFin != null && pDebut != null) {
                    g2.setColor(Color.BLACK);
              
            // calcul de la selection
            final Rectangle rect = new Rectangle((pFin.x > pDebut.x) ? pDebut.x : pFin.x,
                            (pFin.y > pDebut.y) ? pDebut.y : pFin.y,
                            (pFin.x > pDebut.x) ? pFin.x - pDebut.x : pDebut.x
                                    - pFin.x, (pFin.y > pDebut.y) ? pFin.y
                                    - pDebut.y : pDebut.y - pFin.y);
            // dessine le fond de la selection avec un effet de transparence
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .2f));
            g2.fillRect(rect.x, rect.y, rect.width, rect.height);
            // suppression de la transparence pour dessiner la bordure
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f));
            g2.drawRect(rect.x, rect.y, rect.width, rect.height);
        }
       
    }
   

    public void mousePressed(final MouseEvent e) {// Appuyer
        //On récupèrer X et Y de la souris
        pDebut = e.getPoint();
           
    }

    public void mouseReleased(final MouseEvent e) { // Relacher
        pFin = null;
        pDebut = null;
        repaint();
    }

    public void mouseDragged(final MouseEvent e) { // Appuyer + bouger
        //On récupèrer X et Y de la souris
        pFin = e.getPoint();
        repaint();   
    }
   
    public void mouseMoved(final MouseEvent e) {
    }
    public void mouseClicked(final MouseEvent e) {
    }
    public void mouseEntered(final MouseEvent e) {
    }
    public void mouseExited(final MouseEvent e) {
    }

}

Merci

Florent
0
Rejoignez-nous