[JAVA] Convertion image couleur en nuance de gris
Résolu
Radium
-
Radium -
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 :
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.
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.
A voir également:
- [JAVA] Convertion image couleur en nuance de gris
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
6 réponses
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------------------------------------------------- */ } }
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
"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. ;-)
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. ;-)
Faudrait que je donne tout le code du logiciel ??? ou la procédure de transformation en niveau de gris suffit ?
ça c'est la procédure du niveau de gris