[JAVA] Convertion image couleur en nuance de gris [Résolu/Fermé]

Signaler
-
 Radium -
Bonjour, je suis élève de Terminal S, et je suis inscrit en option Informatique.
Notre professeur nous à confectionner un petit interface graphique, ou l'on doit rentrer le nom du fichier image, et cliquer sur l'un des 3 boutons "négatif, niveau de gris ou contraste" pour modifier l'image.
Notre travail est de programmer la modification des images qui aura lieu lorsqu'on utilisera un des 3 boutons.
J'ai réussi la première étape (le négatif) mais je suis bloquer lors de la seconde étape, la nuance de gris.
Après quelques recherches sur le net et conseil du professeur, j'ai compris qu'il fallait utiliser un calcul de la forme R+G+B/3.

J'ai donc programmer cela :


System.out.println(tabPixels.length); 
   int i; 
   for (i=0; i<tabPixels.length; i=i+3) 
   { 
    tabPixels[i]= (byte) ((tabPixels[i]+tabPixels[i+1]+tabPixels[i+2])/3); 
     
    /*System.out.println(tabPixels[i]);*/ 
   } 


Mais lorsque j'exécute le programme, mon image n'est pas modifié dans des nuances de gris mais dans ce que j'appellerai "nuance de bleu".
Mon professeur me dit que je ne suis plus très loin, mais je coince vraiment depuis un bon moment.

Donc si je pouvais avoir des conseil, ou une indication, ça pourrais m'aider pour passer à la suite !

Je vous remercie, bonne journée.


6 réponses

Je vois écris qu'il y a une réponse mais elle n'apparait pas... :'(
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
C'est juste au dessus. Bah c'est dur la avec ce que tu donne comme code, pke on voit pas comment tu modifie ton image, la c'est juste un tableau.
Je vois pas le message, enfin bref.
Faudrait que je donne tout le code du logiciel ??? ou la procédure de transformation en niveau de gris suffit ?
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
transformation en niveau de gris
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
Nan pke ce que tu donne, c'est une boucle qui fait un calcul et range dans un tableau. Après faut voir comment tu utilises ce tableau pour donner une valeur a chaque pixel
  public void noirEtBlanc()
    {
        int longIm, largIm;
        byte[] tabPixels;
        
        BufferedImage ima = loadImage(jTextField1.getText());
        longIm=ima.getHeight();
        largIm=ima.getWidth();
        
        tabPixels=imageBytes(ima); 

ça c'est la procédure du niveau de gris
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
Au cas ou tu vois tjr pas mon msg, poste l'intégralité de ton code stp.
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author Proprietaire
 */
public class imageIsn extends javax.swing.JFrame {

    /**
     * Creates new form NewJFrame
     */
    public imageIsn() {
        initComponents();        
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jSlider1 = new javax.swing.JSlider();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setIcon(new javax.swing.ImageIcon("logo_court.gif")); // NOI18N
        jLabel1.setText("jLabel1");

        jLabel2.setText("Entrer le nom de l'image avec l'extention bmp ou png");

        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jButton1.setText("Negatif");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Noir & Blanc");
        jButton2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton2MouseClicked(evt);
            }
        });

        jButton3.setText("Augmenter contraste");
        jButton3.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton3MouseClicked(evt);
            }
        });

        jSlider1.setMaximum(127);
        jSlider1.setMinimum(-128);

        jLabel4.setText("Pour une photo en N&B");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(28, 28, 28)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(174, 174, 174)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 411, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 229, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 301, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addGap(69, 69, 69)
                            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(49, 49, 49)
                            .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(46, 46, 46)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))))
                .addContainerGap(86, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(26, 26, 26)
                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButton3))
                .addGap(18, 18, 18)
                .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField1ActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jTextField1ActionPerformed

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseClicked
        // TODO add your handling code here:
        
    }//GEN-LAST:event_jButton1MouseClicked

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
        if (jTextField1.getText().equals(""))
                {
                    afficheLabel("Il faut saisir une image");
                }
        else
        {
            transImage();
        }
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton2MouseClicked
        // TODO add your handling code here:
        noirEtBlanc();
    }//GEN-LAST:event_jButton2MouseClicked

    private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton3MouseClicked
        // TODO add your handling code here:
        augmenteContraste();
    }//GEN-LAST:event_jButton3MouseClicked

    private void afficheLabel(String message)
    {
        jLabel3.setText(message);
    }
	 
	public static byte[] imageBytes (BufferedImage im)
	{
		//Un raster est un tableau qui correspond au pixel
		WritableRaster raster=im.getRaster();
		//Décompose le raster en tableau de dataBuffer Octet
		DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
		//renvoie en tableau d'octet qui semble être directememnt lié à l'image, donc le modifier modifie l'image.
		return buffer.getData();
	}
    
    //Fonction qui lit l'image
    private BufferedImage loadImage(String imFnm)
	{
	  BufferedImage im = null;
	  try {
	    im = ImageIO.read( new File(imFnm) );
	    jLabel3.setText("Lecture " + imFnm);
	  } 
	  catch (IOException e) 
	  { jLabel3.setText("Impossibilité de lire l'image " + imFnm);  }

	  return im;
	}   // end of loadImage()
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(imageIsn.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(imageIsn.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(imageIsn.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(imageIsn.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new imageIsn().setVisible(true);
            }
        });
    }
   
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration//GEN-END:variables
	 static final File outputfile = new File("saved.png");
	 static final File outputfile2 = new File("saved2.png");
	 static final File outputfile3 = new File("saved3.png");


/*
 * -----------------------------------------o-o-------------------------------------------------
 *											C'est votre partie
 * -----------------------------------------o-o-------------------------------------------------
*/ 
	 
    
       
    //Procédure qui transforme l'image en négatif
    private void transImage()
    {
	 		//déclaration des variables
        int longIm, largIm;
        byte[] tabPixels;
        //récupération de l'image dont le nom est écrit dans le champ jTextField1
        BufferedImage ima = loadImage(jTextField1.getText());
        longIm=ima.getHeight();
        largIm=ima.getWidth();
        //création du tableau d'octets constituant chaque pixel
        tabPixels=imageBytes(ima);
    	  
		  /*
 			* -----------------------------------------o-o-------------------------------------------------

 			* -----------------------------------------o-o-------------------------------------------------
			*/
        System.out.println(tabPixels.length);
		  int  i;
		  for (i=0; i<tabPixels.length; i++)
		  {
		  			
					tabPixels[i]= (byte)(255-(tabPixels[i]));


					/*System.out.println(tabPixels[i]);*/
		  }
			 
		  
        //Sauvegarde l'image dans le fichier saved.png
		  try {
		  		ImageIO.write(ima, "png", outputfile);
            jLabel3.setText("saved.png créée");
            } catch (IOException e) {
			// TODO Auto-generated catch block
            jLabel3.setText("Problème dans l'écriture de l'image.");
			}
        
    }
    
	 //procédure qui transforme en noir et blanc
    public void noirEtBlanc()
    {
        int longIm, largIm;
        byte[] tabPixels;
        
        BufferedImage ima = loadImage(jTextField1.getText());
        longIm=ima.getHeight();
        largIm=ima.getWidth();
        
        tabPixels=imageBytes(ima);
		  
		  /*
 			* -----------------------------------------o-o-------------------------------------------------
 			*											
 			* -----------------------------------------o-o-------------------------------------------------
			*/
			System.out.println(tabPixels.length);
			int i;
			for (i=0; i<tabPixels.length; i=i+3)
			{
				tabPixels[i]= (byte) ((tabPixels[i]+tabPixels[i+1]+tabPixels[i+2])/3);
				
				/*System.out.println(tabPixels[i]);*/
			}
			
        
           
        //Sauvegarde l'image dans le fichier saved2.png
		  try {
				ImageIO.write(ima, "png", outputfile2);
            jLabel3.setText("saved2.png créée");
            } catch (IOException e) {
				// TODO Auto-generated catch block
            jLabel3.setText("Problème dans l'écriture de l'image.");
	}
        
    }
	//procédure qui augmente le contraste d'une image en dégradé de gris 
 	private void augmenteContraste()
    {
     		/*
 			* -----------------------------------------o-o-------------------------------------------------
 			*											Ecrivez le code ici
 			* -----------------------------------------o-o-------------------------------------------------
			*/
	 
	 
	 
	 }

    

}
Notre niveau ne nous permet pas de comprendre/programmer toute la partie que le prof à créer.
^^
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
OK. Donc la premiere chose a savoir, c'est que les valeur de R G et B dans une image de niveau de gris, sont identiques. C'est à dire que dans ton cas :

tabpix[0] doit etre egal a tabpix[1] et tabpix[2] ce qui n'est pas le cas. Tu modifie seulement la premiere valeure pour chaque pixel (tab[0],tab[3]) car ton i saute de 3 a chaque tour.
Il te suffit d'ajouter pour chaque pixel que :
bleu = rouge;
vert = rouge;
C'est a dire :

for (i=0; i<tabPixels.length; i=i+3)
{
tabPixels[i]= (byte) ((tabPixels[i]+tabPixels[i+1]+tabPixels[i+2])/3);
tabPixels[i+1]=tabPixels[i];
tabPixels[i+2]=tabPixels[i];

/*System.out.println(tabPixels[i]);*/
}

Ainsi, a chaque tour de boucle, tu assigne la meme et bonne valeur dans R G et B (i, i+1, i+2).

Normalement ca devrait marcher.
Excellent ça marche !!! Merci :)
Au final c'était vraiment tout bête mais j'aurais jamais penser à ça ^^

Bon bah plus qu'a programmer la partie contraste ! Merci pour l'aide j'y croyais plus.
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
hehe no problem :)
Messages postés
16331
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
8 mai 2021
2 826
"Je vois écris qu'il y a une réponse mais elle n'apparait pas."
Le problème est réglé, je l'ai déplacé.

@MiGoK : lorsque l'on écrit un "commentaire de la question", celui-ci n'est pas visible par les utilisateurs non-membres (comme Radium par exemple). Il vaut donc mieux écrire des "réponses".

Au passage, je passe la discussion en résolue. ;-)
ça marche, merci ;)
Messages postés
1207
Date d'inscription
vendredi 17 juin 2011
Statut
Membre
Dernière intervention
15 novembre 2018
162
envoi tout le code en pm