Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1435 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Lire un fichier BMP pixel par pixel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lire un fichier BMP pixel par pixel

n°1540377
biboo_
\o/
Posté le 09-04-2007 à 12:22:47  profilanswer
 

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]

mood
Publicité
Posté le 09-04-2007 à 12:22:47  profilanswer
 

n°1540381
breizhbugs
Posté le 09-04-2007 à 13:33:43  profilanswer
 

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
n°1540385
biboo_
\o/
Posté le 09-04-2007 à 14:00:38  profilanswer
 

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
n°1540450
breizhbugs
Posté le 09-04-2007 à 18:45:24  profilanswer
 

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
n°1540537
biboo_
\o/
Posté le 09-04-2007 à 23:22:06  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Lire un fichier BMP pixel par pixel

 

Sujets relatifs
Fichier bat pour sauvegardepreg_replace sur le contenu d'un fichier php (je craque)
sql plus, charger un fichier sql a la connexion ?Parcours fichier Excel
Charger un fichier as externeProblème de type: Pixel =int, char ?
Edition de fichier en Hexa et ChecksumGettext en ASP / fichier .po
Déplacer un fichier...upload fichier multiple
Plus de sujets relatifs à : Lire un fichier BMP pixel par pixel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR