IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Graphisme Java Discussion :

Créer une image à partir d'un tableau (int[][]) de pixel


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 12
    Par défaut Créer une image à partir d'un tableau (int[][]) de pixel
    Bonjour à tous !

    Voilà, je suis actuellement sur un projet.

    Je m'explique : Je dois faire en sorte de pouvoir obtenir la matrice d'une image en noir et blanc d'une certaine manière, ce que j'ai fais, j'ai donc réussi à faire mon tableau de pixel en stockant pour chaque la valeur R de RGB (sachant que pour une image en noir et blanc (R = G = B).

    Là où je suis un bloqué : Il faudrait maintenant que je puisse à partir d'un tableau de pixel, comme celui créé juste avant, afficher/creer une image.
    J'ai fais des recherches sur internet, je continue à en faire mais je ne trouve pas mon bonheur... Je demande donc votre aide tout en espérant que je trouve moi même la solution !

    Je vous remercie !

    Cordialement.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux faire ça avec la classe BufferedImage. Tu crées une instance à la taille qu'il te faut et du type qui correspond à ton tableau (si c'est du RGB, BufferedImage.TYPE_RGB, ou ARGB si c'est transparent, ou GRAY pour du niveau de gris, etc... voir la javadoc de la classe pour tous les types possibles). Ensuite tu récupères un WritableRaster par getRaster() et setPixels(...) pour y mettre un tableau de pixels (en revanche, il doit être à une dimension, il faudra donc convertir ton tableau 2D).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 12
    Par défaut
    Je te remercie de ta réponse, je vais essayer ca au plus vite dans la journée !!! Juste une question, ca ne posera aucun problème que mon tableau ne contient que la valeur r de chaque pixel ? (en sachant, je le rappelle, que pour mon cas chaque pixel a R=G=B)

    Encore merci de ta réponse !

    Cordialement

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    En fait ça dépend du type d'image : en BYTE_GRAY oui, en RGB, il va falloir mettre B=V=R, en ARGB, il faudra ajouter l'alpha (255 si toute l'image est opaque par exemple).

    POC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    public class DemoImage {
     
    	public static final int WIDTH = 100;
    	public static final int OFFSET = 10;
    	private static final int IWIDTH = ((WIDTH/2)-OFFSET);
    	private static final int INB = IWIDTH*IWIDTH;
     
    	public static void main(String[] args) {
     
    		final int[][] array = create();
     
    		final BufferedImage[] images = {
    				createImage(array,convertToRGB(array), BufferedImage.TYPE_INT_RGB),
    				createImage(array,convertToARGB(array), BufferedImage.TYPE_INT_ARGB),
    				createImage(array,convertToGray(array), BufferedImage.TYPE_BYTE_GRAY)
    		};
     
    		final JPanel panel = new JPanel();
    		panel.setBackground(Color.YELLOW);
    		for(final BufferedImage image : images) {
    			panel.add(new JLabel(new ImageIcon(image)));
    		}
     
    		JOptionPane.showMessageDialog(null, panel);
     
    	}
     
    	private static BufferedImage createImage(final int[][] array, final int[] pixelArray, final int type) {  
    		final BufferedImage image = new BufferedImage(array[0].length, array.length, type);
    		final WritableRaster raster = image.getRaster();
    		raster.setPixels(0, 0, array[0].length, array.length, pixelArray);  
    		return image;
    	}
     
    	private static int[] convertToRGB(final int[][] array) {
    		final int[] pixelArray = new int[array.length*array[0].length*3];
    		for(int i=0; i<pixelArray.length; i+=3) {
    			final int r = array[(i/3)/array[0].length][(i/3)%array[0].length];
    			pixelArray[i] = r;
    			pixelArray[i+1] = r;
    			pixelArray[i+2] = r;
    		}
    		return pixelArray;
    	}
    	private static int[] convertToARGB(int[][] array) {
    		final int[] pixelArray = new int[array.length*array[0].length*4];
    		for(int i=0; i<pixelArray.length; i+=4) {
    			int x=(i/4)%array[0].length;
    			int y=(i/4)/array[0].length;
    			final int r = array[y][x];
    			pixelArray[i] = r;
    			pixelArray[i+1] = r;
    			pixelArray[i+2] = r;
    			pixelArray[i+3] = (x>=OFFSET&&x<WIDTH-OFFSET&&y>=OFFSET&&y<WIDTH-OFFSET)?255:0; // alpha 
    		}
    		return pixelArray;
    	}
    	private static int[] convertToGray(int[][] array) {
    		final int[] pixelArray = new int[array.length*array[0].length];
    		for(int i=0; i<pixelArray.length; i++) {
    			final int r = array[i/array[0].length][i%array[0].length];
    			pixelArray[i] = r;
    		} 
    		return pixelArray;
    	}
    	private static int[][] create() {
     
    		final int[][] array = new int[WIDTH][WIDTH];
     
    		for(int i = OFFSET, r=0; i< WIDTH/2; i++) {
    			for(int j = OFFSET; j< WIDTH/2; j++) {
    				array[i][j]=
    				array[j][i]=
    				array[99-i][j]=
    				array[99-j][i]=
    				array[i][99-j]=
    				array[j][99-i]=
    				array[99-i][99-j]=
    				array[99-j][99-i]=(int)(r*255.0/INB);
    				r++;
    			}
    		}
    		return array;
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 12
    Par défaut
    Merci beaucoup pour tes réponses !

    Alors je viens d'essayer et j'ai un message d'erreur, voici le bout de mon code ainsi que le message d'erreur, je précise une chose, le petitre traitement que je fais au début de ma première fonction sur chaque pixel, c'est parce que notre sujet veut que notre pixel soit de 0 à 100 (0 pour blanc, 100 pour noir), de plus 255 pour r, g et b donne blanc et non noir donc j'avais fais une petite conversion pour pouvoir afficher vraiment comme nous demande le sujet donc ne fait pas attention à ce traitement, c'est juste pour remettre chaque pixel comme il faut par rapport à 255 !

    Je m'excuse d'avance si tu trouves mon code horrible et les nomages pas terrible, j'ai fais ca assez vite afin de pouvoir essayer.

    [EDIT] Bien entendu, j'appelle la fonction creerImageMatriceContraste en lui passant mon tableau en paramètre, de ce côté tout va bien normalement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public static void creerImageMatriceContraste(int[][] matriceContraste) {
     
    			int[][] array = matriceContraste;
     
     
    			for (int j=0; j<nb_colonne;j++) {
     
    				for (int i=0; i<nb_ligne; i++) {
     
    					float surcent = ((float)(array[i][j]) / 100) * 255;
    					int pix = (int)(255 - surcent);
     
    					array[i][j] = pix;
     
    				}
     
    			}
     
    			BufferedImage image = createImage(array,convertToRGB(array), BufferedImage.TYPE_INT_RGB);	
     
    			Image newimg = image.getScaledInstance(120, 120, java.awt.Image.SCALE_SMOOTH);
    			image = (BufferedImage) newimg;
     
    			labelContraste.setIcon(new ImageIcon(image));
     
    		}
     
    		public static BufferedImage createImage(final int[][] array, final int[] pixelArray, final int type) {  
    				final BufferedImage image = new BufferedImage(array[0].length, array.length, type);
    				final WritableRaster raster = image.getRaster();
    				raster.setPixels(0, 0, array[0].length, array.length, pixelArray);  
    				return image;
    		}
     
    		public static int[] convertToRGB(final int[][] array) {
    				final int[] pixelArray = new int[array.length*array[0].length*3];
    				for(int i=0; i<pixelArray.length; i+=3) {
    					final int r = array[(i/3)/array[0].length][(i/3)%array[0].length];
    					pixelArray[i] = r;
    					pixelArray[i+1] = r;
    					pixelArray[i+2] = r;
    				}
    				return pixelArray;
    		}

    Et voici le message d'erreur en entier :

    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
    at AppliGraphique.creerImageMatriceContraste(AppliGraphique.java:389)
    at AppliGraphique.contraste(AppliGraphique.java:358)
    at AppliGraphique$4.actionPerformed(AppliGraphique.java:198)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)


    Encore merci !

    Cordialement.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Le problème vient de image = (BufferedImage)newimg dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BufferedImage image = createImage(array,convertToRGB(array), BufferedImage.TYPE_INT_RGB);	
     
    			Image newimg = image.getScaledInstance(120, 120, java.awt.Image.SCALE_SMOOTH);
    			image = (BufferedImage) newimg;
     
    			labelContraste.setIcon(new ImageIcon(image));
    Parce qu'un Image ne peut être casté vers un BufferedImage (l'inverse oui).

    Soit tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BufferedImage image = createImage(array,convertToRGB(array), BufferedImage.TYPE_INT_RGB);	
     
    			Image newimg = image.getScaledInstance(120, 120, java.awt.Image.SCALE_SMOOTH); 
     
    			labelContraste.setIcon(new ImageIcon(newimg ));
    Soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Image image = createImage(array,convertToRGB(array), BufferedImage.TYPE_INT_RGB);	
     
    			image = image.getScaledInstance(120, 120, java.awt.Image.SCALE_SMOOTH); 
     
    			labelContraste.setIcon(new ImageIcon(image));
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une image à partir d'un tableau EXCEL
    Par ARobel20 dans le forum Développement Windows
    Réponses: 0
    Dernier message: 04/04/2014, 17h30
  2. Créer une image à partir d'un tableau de bytes
    Par rockley dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 21/12/2011, 13h59
  3. créer une image à partir d'un tableau de pixels
    Par pfo69 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/12/2007, 06h46
  4. Créer une image à partir d'un fenêtre
    Par dword2add dans le forum Windows
    Réponses: 6
    Dernier message: 19/09/2006, 12h46
  5. Créer une image à partir d'une URL ?
    Par DrySs dans le forum Langage
    Réponses: 1
    Dernier message: 26/01/2006, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo