// références :
// http://www.javaworld.com/javaworld/javatips/jw-javatip43.html
package model;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
public class BMPImage
extends Image {
private int largeur;
private int hauteur;
byte rgb[];
int donnees[];
public BMPImage
(File file
) {
try {
// Lecture du file header
int fhLength = 14;
byte fileBuf[] = new byte[fhLength];
fs.read(fileBuf, 0, fhLength);
// Lecture du info header
int ihLength = 40;
byte infoBuf[] = new byte[ihLength];
fs.read(infoBuf, 0, ihLength);
// Interprétation des deux entêtes
int fSize = (((int) fileBuf[5] & 0xff) << 24)
| (((int) fileBuf[4] & 0xff) << 16)
| (((int) fileBuf[3] & 0xff) << 8) | (int) fileBuf[2]
& 0xff;
System.
out.
println("Type du fichier : " + (char) fileBuf
[0] + (char) fileBuf[1]);
System.
out.
println("Taille du fichier : " + fSize
+ " octets.");
largeur = (((int) infoBuf[7] & 0xff) << 24)
| (((int) infoBuf[6] & 0xff) << 16)
| (((int) infoBuf[5] & 0xff) << 8) | (int) infoBuf[4]
& 0xff;
hauteur = (((int) infoBuf[11] & 0xff) << 24)
| (((int) infoBuf[10] & 0xff) << 16)
| (((int) infoBuf[9] & 0xff) << 8) | (int) infoBuf[8]
& 0xff;
System.
out.
println("Résolution de l'image : " + largeur
+ "*" + hauteur + "(" + (largeur * hauteur) + ")");
int bitsPixel = (((int) infoBuf[15] & 0xff) << 8)
| (int) infoBuf[14] & 0xff;
.println("Nombre de bits : " + bitsPixel + " par pixel.");
int compr = (((int) infoBuf[19]) << 24)
| (((int) infoBuf[18]) << 16) | (((int) infoBuf[17]) << 8)
| (int) infoBuf[16];
System.
out.
println("Compression : " + compr
);
int xpm = (((int) infoBuf[27] & 0xff) << 24)
| (((int) infoBuf[26] & 0xff) << 16)
| (((int) infoBuf[25] & 0xff) << 8) | (int) infoBuf[24]
& 0xff;
System.
out.
println("X-Pixels par mètre : " + xpm
);
int ypm = (((int) infoBuf[31] & 0xff) << 24)
| (((int) infoBuf[30] & 0xff) << 16)
| (((int) infoBuf[29] & 0xff) << 8) | (int) infoBuf[28]
& 0xff;
System.
out.
println("Y-Pixels par mètre : " + ypm
);
int imgSize = (((int) infoBuf[23] & 0xff) << 24)
| (((int) infoBuf[22] & 0xff) << 16)
| (((int) infoBuf[21] & 0xff) << 8) | (int) infoBuf[20]
& 0xff;
System.
out.
println("ImageSize : " + imgSize
);
// Lire les pixels à tour de rôle (pour image 24 bits seulement)
// Dans le cas d'une image 1 bits, 4 bits, 8 bits ou 16 bits, il
// faudra lire la palette de couleurs
// Tenir compte que chaque rangée doit terminer dans un multiple de
// 4 bytes
if (bitsPixel == 24) {
int padRow = (largeur * 3) % 4; // Le padding à ajouter à la fin
// de la ligne si elle n'est pas
// un multiple de 4
donnees = new int[hauteur * largeur];
rgb = new byte[(largeur + padRow) * 3 * hauteur];
fs.read(rgb, 0, (largeur + padRow) * 3 * hauteur);
int index = 0;
for (int j = 0; j < hauteur; j++) {
for (int i = 0; i < largeur; i++) {
donnees[largeur * (hauteur - j - 1) + i] = (255 & 0xff) << 24
| (((int) rgb[index + 2] & 0xff) << 16)
| (((int) rgb[index + 1] & 0xff) << 8)
| (int) rgb[index] & 0xff;
index += 3;
}
index += padRow;
}
}
System.
out.
println("Exception lors du chargement du bitmap : " + e.toString());
}
}
@Override
finalImage.setRGB(0, 0, largeur, hauteur, donnees, 0, largeur);
return finalImage;
}
@Override
public int getHeight() {
;
return hauteur;
}
@Override
public int getWidth() {
return largeur;
}
}