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

 Java Discussion :

BufferedImage, erreur avec getRGB


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Par défaut BufferedImage, erreur avec getRGB
    Bonjour, dans mon code je charge une image à partir d'un fichier BMP, ceci se fait correctement (je peux récupérer les dimensions 32x32 qui correspondent correctement à celles de l'image en question), puis je souhaite récupérer la matrice des pixels (getRGB), et là le tableau ne récupère apparement rien du tout, ou de fausses valeurs, voici mon code :

    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
    // Tampon pour les images
    import java.awt.image.BufferedImage;
     
    // Lecture & écriture d'images
    import javax.imageio.ImageIO;
     
    // Exceptions et fichiers
    import java.io.IOException;
    import java.io.File;
     
     
    public class Main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		System.out.println("Ouverture de l'image BMP...");
     
    		try {
     
    			// Ouverture fichier
    			File fichierBMP = new File("test.bmp");
     
    			// Récupération du fichier dans un buffer
    			BufferedImage imageBMP = ImageIO.read(fichierBMP);
     
    			// Récupération des dimensions
    			int largeur = imageBMP.getWidth();
    			int hauteur = imageBMP.getHeight();
     
    			// Allocation matrice
    			int[] matriceCouleurs = new int[hauteur * largeur];
     
    			// Récupération de la matrice
    			imageBMP.getRGB(0, 0, largeur, hauteur, matriceCouleurs, 0, largeur);
    		}
    		catch(IOException exceptIO) {
     
    			System.err.println("Erreur !");
    		}
    	}
    }
    Il doit sûrement y avoir une erreur, si vous pouviez m'y aider...

    Merci beaucoup !

  2. #2
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Par défaut
    Bonjour,

    simplement tu ne dois pas lire la matrice dans un tableau d'int mais bien dans un tableau d'octets, donc il ne faut pas le lire avec des données de type int mais plutôt des séries de 3 byte. (voire 4 byte si l'image comporte de l'alpha)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Par défaut
    Merci pour la réponse,
    En fait je prends directement exemple là : http://java.developpez.com/faq/gui/?...general_images

    Qui utilise aussi un int[], cependant mon image est en 24bits, ce serait d'ici d'où proviendrait l'erreur ?

    Je dois déclarer quel tableau alors ?

    Merci

  4. #4
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Par défaut
    Bonjour,

    en fait après un petit test sur image, j'obtiens par exemple avec un tableau int[]:

    -6710887

    ce qui correspond donc à 0xFFFFFFFFFF999999

    ce qui voudrait donc dire que c'est bien un tableau d'int[] et que les valeurs que tu reçois sont correctes.

    Après recherche sur le forum, ce code devrait fonctionner, en tout cas c'est le cas chez moi.

    le premier code récupère les valeurs r,v,b et alpha de l'image


    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
    private int[][] getPix(Image image){ // Reçoit une image et renvoie un tableau 2D : A, R, V, B
      BufferedImage bi=toBufferedImage(image); // Conversion en BufferedImage
      int w=getSize(image)[1]; int h=getSize(image)[0];
      int[][]tablo=new int[w*h][4];
      for(int x=0;x<h;x++){
        for(int y=0;y<w;y++){
          int rgb = bi.getRGB(y,x);
          int alpha = ((rgb >>24 ) & 0xFF);tablo[x*w+y][0]=alpha;
          int rouge = ((rgb >>16 ) & 0xFF);tablo[x*w+y][1]=rouge;
          int vert = ((rgb >>8 ) & 0xFF);tablo[x*w+y][2]=vert;
          int bleu = (rgb & 0xFF);tablo[x*w+y][3]=bleu;
        }
      }
      return tablo;
    }
    où la méthode toBufferedImage est:

    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
    BufferedImage toBufferedImage(Image image) {   // Conversion d'une image en BufferedImage
            // On teste si l'image n'est pas déja une instance de BufferedImage
            if(image instanceof BufferedImage) {
                    // On ne fait rien !
                    return((BufferedImage)image);
            } else {
                    // On s'assure que l'image est complètement chargée
                    image = new ImageIcon(image).getImage();
                    // On crée la nouvelle image
                    BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB );
                    Graphics g = bufferedImage.createGraphics();
                    g.drawImage(image,0,0,null);
                    g.dispose();
                    return(bufferedImage);
            }
     }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 125
    Par défaut
    D'accord, donc mon code devrait fonctionner ou pas sur une image BMP 24 bytes ?

    Merci

  6. #6
    Membre expérimenté Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Par défaut
    Oui, tu dois juste utiliser la fonction de conversion que je t'ai copiée pour récupérer les valeurs rgba

Discussions similaires

  1. Erreur Avec Interbase
    Par smokemon dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2004, 07h24
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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