Selectionner partie d'une image

Signaler
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016
-
cs_flolag
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016
-
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

Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

Derniere question là si je rétrécie mon rectangle celui d'avant reste affiché comment fair ?

Florent
Messages postés
5348
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 mars 2020
93
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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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
Messages postés
114
Date d'inscription
mardi 9 avril 2002
Statut
Membre
Dernière intervention
12 août 2016

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