Modifier la couleur d'un pixel en Java ( getpixel ???)

Soadnemesis Messages postés 4 Date d'inscription lundi 15 mars 2010 Statut Membre Dernière intervention 27 décembre 2013 - 17 août 2010 à 19:23
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 20 août 2010 à 20:01
Bonjour à tous,

J'aimerais réaliser un petit outil simple qui changerais la couleur d'un pixel ou d'un groupe de pixel.

Je m'explique, je pars d'une petite application Java de type Paint et j'aimerais créer un outil de type crayon/pinceau ou il serait possible de modifier la couleur du dernier élément tracé.

Le truc c'est que je suis loin d'être un expert en java et je ne vois pas comment garder en mémoire le tracer et modifier sa couleur. Après quelques recherche je suis tombé sur la fonction getpixel mais je ne sais pas si c'est la bonne voie et si oui comment l'adapter a mon problème.

Des idées ??

Merci d'avance.

7 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
18 août 2010 à 09:01
Pour créer ton outil de crayon/pinceau, tu vas avoir un gros problème si tu utilises les pixels, tu ne parviendra pas à tracer des coubes continues dès que tu vas bouger e pointeur assez rapidement.

Pour t'en sortir, dès que l'utilisateur enfonce le click, tu créé un nouveau polygone et lorqu'il glisse la souris, tu enregistre les coordonnées dans ce polygone.

Et ensuite, pour afficher le dessi, il ne te reste plus qu'à utiliser drawPolygon et c'est reglé.


public class ConstructionImage extends JPanel{

private static final long serialVersionUID = 1L;
/** les coordonnées des points */
private ArrayList pX = new ArrayList();
private ArrayList pY = new ArrayList();
/** le polygone */
Polygon polygone;


public ConstructionImage(){
addMouseListener(new MouseListener() {

/**
 * action qui se déclenche quand on relache la souris
 */
public void mouseReleased(MouseEvent arg0) {
for(int k=0; k<pX.size(); k++){
polygone.addPoint(pX.get(k), pY.get(k));
}
pX.clear();
pY.clear();
}


public void mousePressed(MouseEvent a) {
polygone = new Polygone();
}

public void mouseExited(MouseEvent arg0) {

               		}

public void mouseEntered(MouseEvent arg0) {

}

public void mouseClicked(MouseEvent arg0) {

}
});
addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent arg0) {

}

public void mouseDragged(MouseEvent a) {
pX.add(a.getX());
pY.add(a.getY());
repaint();
}
});

}

/**
 * Surcharge de paintComponent
 */
public void paintComponent(Graphics g) {
g.drawPolygon(polygone);
}
}


Ce code n'est pas complet, il ne permet que de dessiner une forme, quand on en dessine une autre, la première est écrasée. En utilisant une liste de polygones, tu t'en sortira facilement.

Je n'ai pas testé le code, c'est juste pour te donner une idée.

Bon courage
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
18 août 2010 à 09:02
il va y avoir un problème avec le repaint qui n'est pas au bon endroit et pas très bien géré de surcroit
0
Soadnemesis Messages postés 4 Date d'inscription lundi 15 mars 2010 Statut Membre Dernière intervention 27 décembre 2013
18 août 2010 à 11:16
Merci beaucoup pour la réponse. Malheureusement je n'ai pas du bien m'expliquer. Ce que je souhaite ce n'est pas faire un outil paint comme un pinceau. Ce que je voudrais faire c'est :
une fois le tracé du polygone ( ou même d'un point avec le pinceau) effectué modifier la couleur des pixels de la forme venant d'être ajouté au dessin.

En clair cela reviendrait au faite de refaire exactement le même tracé par dessus le 1er en modifiant juste la couleur. Le problème c'est que je ne veux pas refaire un tracé par dessus ca serait trop simple. Je voudrais modifier les valeurs des pixels. Bon en soit ca revient au même je suis d'accords mais c'est la démarche qui m'intéresse.

Ok ok dite moi si je suis tordu et que je suis le seul a me comprendre.

Comme solution je pense qu'il serait peut être possible de garder en mémoire (sous la forme d'un tableau d'int ?) l'image du dessin avant tracé et l'image après tracé. Le but étant ensuite de comparer ces 2 images et de détecter les pixels qui ont été modifiés. Ensuite il ne reste plus qu'a leur effectuer une nouvelle valeur de couleur. Bon ca c'est ma théorie je ne sais pas si c'est réalisable et encore moins comment faire.

En tout cas merci beaucoup pour votre aide.
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
18 août 2010 à 11:48
Salut,

À mon avis, le plus simple serait quand même de redessiner par dessus.
Si tu veux changer la couleur des pixels, il te faudra les changer 1 par 1, ça risque d'être très compliqué et plus coûteux.

Jonathan
0

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

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
20 août 2010 à 19:53
Oui c'est ca, tu mets un attribut couleur dans ta classe et dans la méthode paintComponent tu mets un g.setColor(couleur);

Quand repaint sera appelée, tu mets à jour la couleur. Tu peux donc la changer
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
20 août 2010 à 20:00
Si tu tiens à tout prix à passer pixel par pixel, tu peux le faire mais c'est assez long et pas très astucieux

/** Tableau de toutes les couleurs de ton image */
private Color[][] image;

BufferedImage b = ImageIO.read(new File(adresse));
h = b.getHeight();
w = b.getWidth();
image = new Color[w][h];
for(int wi=0; wi<w; wi++){
for(int hi=0; hi<h; hi++){
Color pixel = new Color(b.getRGB(wi, hi));
image[wi][hi] = pixel;
}
}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 366
20 août 2010 à 20:01
Quand tu as le tableau des couleurs des pixels, tu peux modifier les couleurs facilement et ensuite pour l'affichage :

protected void paintComponent(Graphics g){
for(int wi=0; wi<w; wi++){
for(int hi=0; hi<h; hi++){
g.setColor(image[wi][hi]);
g.fillRect(wi, hi, 1, 1);
}
}
}
0