Lire et écrire un fichier bmp

Contenu du snippet

Cette petite classe permet d'obtenir une image provenant d'un fichier BMP et permet aussi d'en faire la sauvegarde.
NOTA BENE : le code qui concerne l'écriture a été trouvé dans un code sur un autre site

Source / Exemple :


/**

  • <p>Titre : BMPImage</p>
  • <p>Description : Classe décrivant la maniére d'enregistrer un fichier image BMP</p>
  • <p>Société : Perso</p>
  • @author Indiana_jules
  • @version 1.0
  • /
//Importation des packages nécessaires import java.awt.Image; import java.awt.image.BufferedImage; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class BMPImage { //Constantes private static final int MASK = 0xFF;/**Constante de masque pour la comparaison bit à bit*/ /**Méthode permettant de lire une image au format BMP
  • @param filename Fichier image
  • @return Image généré*/
public static Image readBMP(File filename) { try{ DataInputStream inBMP = new DataInputStream(new FileInputStream(filename)); //On va lire le début de l'entête inBMP.skipBytes(18); //Maintenant, on lit la largeur et la hauteur de l'image int width = readInt(inBMP); int height = readInt(inBMP); //On saute les données inutiles del'entête inBMP.skipBytes(28); //Nous allons remplir le BufferedImage BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); int sup = (width * 3) % 4; //Lecture des données for(int y = height - 1; y >= 0; y--){ for(int x = 0; x < width; x++){ //Récupération des couleurs img.setRGB(x, y, readColor(inBMP)); } //On saute le bourrage inBMP.skipBytes(sup); } inBMP.close(); return img; } catch(Exception e){ return null; } } /**Méthode permettant de lire une image au format BMP
  • @param filename Endroit où il faut le sauver
  • @return Image généré*/
public static Image readBMP(String filename) { return readBMP(new File(filename)); } /**Méthode permettant de lire un entier dans un fichier BMP
  • @param in Flux d'entrée
  • @return Entier lu*/
private static int readInt(DataInputStream in){ byte[] b = new byte[4]; int result = 0; try{ in.read(b); result = b[0] & MASK; result = result + ((b[1] & MASK) << 8); result = result + ((b[2] & MASK) << 16); result = result + ((b[3] & MASK) << 24); } catch(Exception e){ } return result; } /**Méthode permettant de lire une "couleur" dans un fichier BMP
  • @param in Flux d'entrée
  • @return Entier lu*/
private static int readColor(DataInputStream in){ byte[] b = new byte[3]; int result = 0; try{ in.read(b); result = b[0] & MASK; result = result + ((b[1] & MASK) << 8); result = result + ((b[2] & MASK) << 16); } catch(Exception e){ } return result; } /**Méthode permettant de créer une image au format BMP
  • @param img Image à sauver
  • @param filename Endroit où il faut le sauver
  • @return Permet de savoir si l'enregistrement s'est bien passé*/
public static boolean writeBMP(BufferedImage img, String filename) { try{ DataOutputStream outBMP = new DataOutputStream(new FileOutputStream(filename)); int resx = img.getWidth(); int resy = img.getHeight(); //écriture de l'entête du fichier outBMP.write(0x42); //Type outBMP.write(0x4D); //Type writeInt(outBMP,resx*resy*3+54); //Taille du fichier writeInt(outBMP,0); //Réservé writeInt(outBMP,54); writeInt(outBMP,40); writeInt(outBMP,resx); //Largeur writeInt(outBMP,resy); //Hauteur outBMP.write(0); outBMP.write(0); outBMP.write(24); //Nombre de bits par pixel outBMP.write(0); writeInt(outBMP,0); writeInt(outBMP,resx*resy*3); writeInt(outBMP,2851); writeInt(outBMP,2851); writeInt(outBMP,0); writeInt(outBMP,0); //Ecriture du corps dufichier BMP int sup = (resx * 3) % 4; for (int y = resy - 1; y >= 0; y--) { for (int x = 0; x < resx; x++) { //On écrit la couleur writeColor(outBMP, img.getRGB(x, y)); } //Bourrage for (int j = 0; j < sup; j++) outBMP.writeByte(0); } //Fermeture du fichier outBMP.close(); return true; } catch(Exception e){ return false; } } /**Méthode permettant d'écrire un int dans un DataOutputStream selon les format Intel
  • @param sortie Stream de destination
  • @param n int à écrire*/
private static void writeInt(DataOutputStream sortie, int n) { try { sortie.write((n) & MASK); sortie.write((n>>8) & MASK); sortie.write((n>>16) & MASK); sortie.write((n>>24) & MASK); } catch (Exception e) { } } /**Méthode permettant d'écrire une "couleur" dans un DataOutputStream
  • @param sortie Stream de destination
  • @param couleur Couleur à écrire */
private static void writeColor(DataOutputStream sortie, int couleur) { try { sortie.write((couleur) & MASK); sortie.write((couleur>>8) & MASK); sortie.write((couleur>>16) & MASK); } catch (Exception e) { } } }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.