Lire un fichier BMP pixel par pixel

Lire un fichier BMP pixel par pixel - Java - Programmation

Marsh Posté le 09-04-2007 à 12:22:47    

Bonjour à tous,
 
pour faire bref, je dois récupérer la couleur de chaque pixel (représenté par un entier) et la placer dans un tableau, tout ceci depuis
une image au format BMP. A noter que la valeur de chaque pixel doit se situer entre 0 et 255 (ou -127 et 128).
Voici la méthode:
 

Code :
  1. public static int[] getPixelTable(String absolutePathFileName) {
  2.    try {
  3.    byte tabBmp[];
  4.    int rgbs[] = null;
  5.    // création d'un flux
  6.    FileInputStream fin = new FileInputStream(absolutePathFileName);
  7.    tabBmp = new byte[fin.available()];
  8.    fin.read(tabBmp);
  9.    if (tabBmp.length >0 ) {
  10.     // la fonction byteArrayToInt(int offset, int nbyte) récupère un entier "de offset à offset+nbyte"; elle marche parfaitement
  11.     int intLargeur = byteArrayToInt(tabBmp,18,4);
  12.     int intHauteur = byteArrayToInt(tabBmp,22,4);
  13.     int intOffsetPixel = byteArrayToInt(tabBmp,10,4);
  14.     ColorModel monoChromeModel = new IndexColorModel(1,2,
  15.       new byte[] {(byte)0, (byte)255},
  16.       new byte[] {(byte)0, (byte)255},
  17.       new byte[] {(byte)0, (byte)255});
  18.     ByteBuffer BufferTabPixel = ByteBuffer.allocate (tabBmp.length-intOffsetPixel);
  19.     byte[] tabPixel = BufferTabPixel.array();
  20.     DataBuffer db = new DataBufferByte(tabPixel,tabPixel.length);
  21.     WritableRaster wr = Raster.createPackedRaster(db,intLargeur,intHauteur,1,null);
  22.     //creation du BufferedImage
  23.     BufferedImage afpImage = new BufferedImage(monoChromeModel,wr,false,null);
  24.     int w = afpImage.getWidth();
  25.     int h = afpImage.getHeight();
  26.     rgbs = new int[w*h]; /** on crée l'espace nécessaire */
  27.     //copie de chaque piskel du bufferedImage (afpImage)  vers un tableau d'entiers (rgbs)
  28.     afpImage.getRGB(0,0,w,h,rgbs,0,w);
  29.    }
  30.    fin.close();
  31.    return rgbs;
  32.   } catch(IOException ie) {
  33.    System.out.println("Erreur: "+ie);
  34.    return null;
  35.   }
  36.  }


 
Le problème, c'est que le tableau contient des valeurs trop grandes :/ :
 

indice : 3597 main : -16777216
indice : 3598 main : -16777216
indice : 3599 main : -16777216


 
Quel est le problème, mais surtout quel y-a-t-il un autre moyen de récupérer toutes les valeurs d'une image BMP dans un tableau?
Merci d'avance pour vos conseils/critiques/suggestions.  [:alina95]

Reply

Marsh Posté le 09-04-2007 à 12:22:47   

Reply

Marsh Posté le 09-04-2007 à 13:33:43    

C'est quoi le code qui affiche ton tableau?
Sinon quand tu dis chaque pixel doit se trouver entre 0 et 255, c'est seulement pour les bmp 8 bits si ca existe encore car en general les pixels sont codés sur 24bits (3 octets), ce qui donne 8 bits par composante rouge vert et bleu.
Donc précise plus exactement ce que tu veux...
D'apres la doc de getRGB, il te renvoie une tableau de couleur sur 32bit, chaque valeur d'un "pixel" comprend le code couleur des trois composantes (rgb), chacune etant sur 8bits, les 8 bits restant etant la transparence (non pris en charge par les bmp si je ne m'abuse -on me corrigera si je me trompe)

Message cité 1 fois
Message édité par breizhbugs le 09-04-2007 à 13:45:26
Reply

Marsh Posté le 09-04-2007 à 14:00:38    

breizhbugs a écrit :

C'est quoi le code qui affiche ton tableau?
Sinon quand tu dis chaque pixel doit se trouver entre 0 et 255, c'est seulement pour les bmp 8 bits si ca existe encore car en general les pixels sont codés sur 24bits (3 octets), ce qui donne 8 bits par composante rouge vert et bleu.
Donc précise plus exactement ce que tu veux...
D'apres la doc de getRGB, il te renvoie une tableau de couleur sur 32bit, chaque valeur d'un "pixel" comprend le code couleur des trois composantes (rgb), chacune etant sur 8bits, les 8 bits restant etant la transparence (non pris en charge par les bmp si je ne m'abuse -on me corrigera si je me trompe)


 
En fait, il me faudrait extraire la valeur de la couleur bleu de chaque pixel, ce d'une image en 24 bits (j'ai finalement décidé de ne pas utiliser les BitMap 8bits). Je sais qu'il y a la méthode getBlue de la classe ColorModel mais je ne vois vraiment pas comment l'utiliser autre que:

Code :
  1. //afpImage est un BufferedImage
  2. int blueValue = afpImage.getColorModel().getBlue(valeur)


 
edit: ok le fait de créer un ColorModel monochrome n'aide pas vraiment..


Message édité par biboo_ le 09-04-2007 à 14:03:32
Reply

Marsh Posté le 09-04-2007 à 18:45:24    

Fais plutot une boucle sur la longueur x et la largeur y de ton bitmap ensuite utilise
Color c(afpImage.getRGB(x,y)); // http://java.sun.com/j2se/1.4.2/doc [...] nt,%20int)
et tu fais int bleu = c.getBlue(); // http://java.sun.com/j2se/1.4.2/doc [...] #getBlue()
 
Je suis pas sur qu'au niveau performance c'est genial, mais je vois pas autre chose ...


Message édité par breizhbugs le 09-04-2007 à 18:46:55
Reply

Marsh Posté le 09-04-2007 à 23:22:06    

En fait j'ai extrait "manuellement" la couleur "bleu" de chaque pixel.

 
Code :
  1. int mask = 0xff;
  2. //im est un BufferedImage
  3. for(int i=0;i<h;i++) {
  4. for(int j=0;j<w;j++) {
  5.  rgb=im.getRGB(i,j);
  6.  tab2dim[i][j] = rgb & mask; //extraction de la couleur "bleu"
  7. }
  8. }


Tout ceci fonctionne. Voilà :)
Merci breizhbugs. ;)


Message édité par biboo_ le 09-04-2007 à 23:23:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed