Read .BPM file in java

  1. // références :
  2. // http://www.javaworld.com/javaworld/javatips/jw-javatip43.html
  3. package model;
  4.  
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8.  
  9. public class BMPImage extends Image {
  10.  
  11. private int largeur;
  12. private int hauteur;
  13. BufferedImage finalImage;
  14. byte rgb[];
  15. int donnees[];
  16.  
  17. public BMPImage(File file) {
  18.  
  19. try {
  20.  
  21. // Lecture du file header
  22. int fhLength = 14;
  23. byte fileBuf[] = new byte[fhLength];
  24. fs.read(fileBuf, 0, fhLength);
  25.  
  26. // Lecture du info header
  27. int ihLength = 40;
  28. byte infoBuf[] = new byte[ihLength];
  29. fs.read(infoBuf, 0, ihLength);
  30.  
  31. // Interprétation des deux entêtes
  32. int fSize = (((int) fileBuf[5] & 0xff) << 24)
  33. | (((int) fileBuf[4] & 0xff) << 16)
  34. | (((int) fileBuf[3] & 0xff) << 8) | (int) fileBuf[2]
  35. & 0xff;
  36.  
  37. System.out.println("Type du fichier : " + (char) fileBuf[0]
  38. + (char) fileBuf[1]);
  39. System.out.println("Taille du fichier : " + fSize + " octets.");
  40.  
  41. largeur = (((int) infoBuf[7] & 0xff) << 24)
  42. | (((int) infoBuf[6] & 0xff) << 16)
  43. | (((int) infoBuf[5] & 0xff) << 8) | (int) infoBuf[4]
  44. & 0xff;
  45.  
  46. hauteur = (((int) infoBuf[11] & 0xff) << 24)
  47. | (((int) infoBuf[10] & 0xff) << 16)
  48. | (((int) infoBuf[9] & 0xff) << 8) | (int) infoBuf[8]
  49. & 0xff;
  50.  
  51. System.out.println("Résolution de l'image : " + largeur + "*"
  52. + hauteur + "(" + (largeur * hauteur) + ")");
  53.  
  54. int bitsPixel = (((int) infoBuf[15] & 0xff) << 8)
  55. | (int) infoBuf[14] & 0xff;
  56. System.out
  57. .println("Nombre de bits : " + bitsPixel + " par pixel.");
  58.  
  59. int compr = (((int) infoBuf[19]) << 24)
  60. | (((int) infoBuf[18]) << 16) | (((int) infoBuf[17]) << 8)
  61. | (int) infoBuf[16];
  62. System.out.println("Compression : " + compr);
  63.  
  64. int xpm = (((int) infoBuf[27] & 0xff) << 24)
  65. | (((int) infoBuf[26] & 0xff) << 16)
  66. | (((int) infoBuf[25] & 0xff) << 8) | (int) infoBuf[24]
  67. & 0xff;
  68. System.out.println("X-Pixels par mètre : " + xpm);
  69.  
  70. int ypm = (((int) infoBuf[31] & 0xff) << 24)
  71. | (((int) infoBuf[30] & 0xff) << 16)
  72. | (((int) infoBuf[29] & 0xff) << 8) | (int) infoBuf[28]
  73. & 0xff;
  74. System.out.println("Y-Pixels par mètre : " + ypm);
  75.  
  76. int imgSize = (((int) infoBuf[23] & 0xff) << 24)
  77. | (((int) infoBuf[22] & 0xff) << 16)
  78. | (((int) infoBuf[21] & 0xff) << 8) | (int) infoBuf[20]
  79. & 0xff;
  80. System.out.println("ImageSize : " + imgSize);
  81.  
  82. // Lire les pixels à tour de rôle (pour image 24 bits seulement)
  83. // Dans le cas d'une image 1 bits, 4 bits, 8 bits ou 16 bits, il
  84. // faudra lire la palette de couleurs
  85. // Tenir compte que chaque rangée doit terminer dans un multiple de
  86. // 4 bytes
  87. if (bitsPixel == 24) {
  88. int padRow = (largeur * 3) % 4; // Le padding à ajouter à la fin
  89. // de la ligne si elle n'est pas
  90. // un multiple de 4
  91. donnees = new int[hauteur * largeur];
  92. rgb = new byte[(largeur + padRow) * 3 * hauteur];
  93.  
  94. fs.read(rgb, 0, (largeur + padRow) * 3 * hauteur);
  95. int index = 0;
  96.  
  97. for (int j = 0; j < hauteur; j++) {
  98. for (int i = 0; i < largeur; i++) {
  99. donnees[largeur * (hauteur - j - 1) + i] = (255 & 0xff) << 24
  100. | (((int) rgb[index + 2] & 0xff) << 16)
  101. | (((int) rgb[index + 1] & 0xff) << 8)
  102. | (int) rgb[index] & 0xff;
  103. index += 3;
  104. }
  105. index += padRow;
  106. }
  107. }
  108. } catch (Exception e) {
  109. System.out.println("Exception lors du chargement du bitmap : "
  110. + e.toString());
  111. }
  112. }
  113.  
  114. @Override
  115. public BufferedImage draw() {
  116. finalImage = new BufferedImage(largeur, hauteur,
  117. BufferedImage.TYPE_INT_ARGB);
  118. finalImage.setRGB(0, 0, largeur, hauteur, donnees, 0, largeur);
  119. return finalImage;
  120. }
  121.  
  122. @Override
  123. public int getHeight() {
  124. ;
  125. return hauteur;
  126. }
  127.  
  128. @Override
  129. public int getWidth() {
  130. return largeur;
  131. }
  132. }