Transformer une image monochrome en tableau de bit

Transformer une image monochrome en tableau de bit - Java - Programmation

Marsh Posté le 24-04-2004 à 14:39:42    

Salut :)
 
Je cherche à tranformer un bitmap (ou autre) en un tableau à deux dimension, avec en indice les coordonées de chaque pixel de l'image, contenant des bit (soit 0 noir, soit 1 blanc).
Quelle class me serait utile ?
 
Merci d'avance ;)
 
a+

Reply

Marsh Posté le 24-04-2004 à 14:39:42   

Reply

Marsh Posté le 25-04-2004 à 02:42:17    

albataur a écrit :

Salut :)
 
Je cherche à tranformer un bitmap (ou autre) en un tableau à deux dimension, avec en indice les coordonées de chaque pixel de l'image, contenant des bit (soit 0 noir, soit 1 blanc).
Quelle class me serait utile ?
 
Merci d'avance ;)
 
a+


 
Au hasard : java.awt.image.BufferedImage(int width, int height, BufferedImage.TYPE_INT_RGB) (de mémoire, hein... Et puis ça dépend de l'image de départ :o )
Il suffit ensuite de faire des getRGB(x, y) dessus qui te renverront un int.
Ensuite avec ce int tu construis un java.awt.color(int rgb)
et puis avec ça t'as les 3 composantes RGB du pixel entre 0 et 255...
Ton seuillage noir et blanc ne devrait plus te poser de problème. (genre int blackAndWhite = (((pix.red + pix.blue + pix.green ) / (3 * 255)) > 0.5)? 1 : 0  :heink:  
Bon, si le problème c'est mettre ton image dans le BufferedImage, utilise ImageIO.read(File f) (de mémoire aussi, faut vérifier)qui curieusement n'accepte pas les BMP, je crois. Par contre pas de problème pour les JPEG et les PNG.  :(  
 
Bon, tu devrais t'en sortir [:b-s]

Reply

Marsh Posté le 25-04-2004 à 15:42:47    

En fait entre temps j'avais déja commencé et c'est effectivement ce que j'avais pris comme solution.
Donc ça marche parfaitement comme je le veux. Voici ce que ça donne :
 
L'image d'origine (zoomée 8x et avec une grille)
http://bougetoi.com/autres/screen_map.GIF
 
Le résultat de mon programme de test :


----------
--0000----
----------
----0-----
-0--0-----
-0--0-----
-0--000---
----------
-----000--
----------


 
Les sources de la classe :

Code :
  1. /**
  2. *This class create an object Map.
  3. *The map is represented by an array of boolean. True = there is wall, false = no wall
  4. *For creating the array it read a b&w image
  5. * @author Alesky
  6. * @version 0.1
  7. */
  8. import java.awt.image.*;
  9. import javax.imageio.*;
  10. import java.io.*;
  11. class Map{
  12.     public boolean map[][];
  13.     public int w;
  14.     public int h;
  15.     //Constant who contain the integer corresponding with the color
  16.     public static final int WHITE=-1;
  17.     public static final int BLACK=-16777216;
  18.     public Map(String file, int w, int h){
  19.     /**
  20.       * The constructor
  21.       * @param file Nom de fichier de l'image de la map
  22.       * @param w Largeur de la carte et de l'image
  23.       * @param h Hauteur de la carte et de l'image
  24.       */
  25. BufferedImage mapImage;
  26.         int i=0;
  27. int j=0;
  28. this.w=w;
  29. this.h=h;
  30. map = new boolean[w][h];
  31. //Open and create the buffer image
  32. try {
  33.     mapImage = ImageIO.read(new File(file));
  34.         }
  35. catch (IOException e) {
  36.             mapImage = null;
  37.             System.err.println("Fichier image de la map invalide" );
  38.         }
  39. //Create the map table
  40. while(i<10){
  41.     //On parcourt les colonnes
  42.     j=0;
  43.     while(j<10){
  44.  //On parcourt les lignes
  45.  map[i][j]=intRGBToBoolean(mapImage.getRGB(i,j));
  46.  j++;    
  47.     }
  48.     i++;
  49. }
  50.     }
  51.    
  52.     //This method is juste for testing the class
  53.     public static void main(String args[]){
  54. int i=0;
  55. int j=0;
  56. Map mapTest = new Map("map.GIF",10,10);
  57.    
  58. while(i<10){
  59.     //On parcourt les colonnes
  60.     j=0;
  61.     while(j<10){
  62.  if(mapTest.map[j][i])
  63.      System.out.print("0" );
  64.  else
  65.      System.out.print("-" );
  66.         j++;    
  67.     }
  68.     System.out.println();
  69.     i++;
  70. }
  71.     }
  72.    
  73.     private boolean intRGBToBoolean(int intRGB){
  74. if(intRGB==BLACK)
  75.     return(true);
  76. else
  77.     return(false);
  78.     }
  79.    
  80. }


 
Merci beaucoup pour ton aide ;)
 
a+


Message édité par albataur le 25-04-2004 à 15:44:41
Reply

Marsh Posté le 25-04-2004 à 20:27:21    

Ok  :sweat:  
 
Mais pkoi bordel de Dieu est-ce que tu mets tes dimensions en hard? Tu peux les lire sur la BufferedImage, arrête de faire le mazo, la moindre retouche sur tes dix lignes de codes va te prendre plus de temps que la sortie d'un service pack pour WinXP
 

Code :
  1. Map mapTest = new Map("map.GIF",10,10);


 
Avec
 

Code :
  1. while(i<10){
  2.              //On parcourt les colonnes
  3.              j=0;
  4.              while(j<10){
  5.             //On parcourt les lignes
  6.             map[i][j]=intRGBToBoolean(mapImage.getRGB(i,j));
  7.             j++;     
  8.              }
  9.              i++;
  10.        }
  11.         }


 
 
 
D'une manière général, prend les informations là ou elles sont sur les objets! Si tu modifies ton w ou ton h dans le main sur l'appel au constructeur de map, ton programme plante dans la boucle...
 
Edit : gt imcompréhensible  :o


Message édité par seabee le 25-04-2004 à 20:30:31
Reply

Marsh Posté le 25-04-2004 à 21:48:56    

Complètement d'accord. D'ailleurs à l'origine c'était prévu. C'est juste une erreur d'inatention.
Merci :)

Reply

Sujets relatifs:

Leave a Replay

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