Lire et écrire un fichier bmp

Soyez le premier à donner votre avis sur cette source.

Snippet vu 34 262 fois - Téléchargée 25 fois

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

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 11 juin 2010
Statut
Membre
Dernière intervention
11 juin 2010

Bonjour,

il y a une erreur sur le calcul de sup (aux lignes 41 et 143), auquel est affecté le nombre d'octets par ligne de l'image modulo 4.
Sauf erreur de ma part, ce qu'il fallait était le complément à 4 de ce nombre, à un modulo près.
Rajouter à la ligne :

if(sup!=0)
sup = 4-sup;
Messages postés
2
Date d'inscription
jeudi 11 février 2010
Statut
Membre
Dernière intervention
8 mai 2010

comment faire l'appel à ces méthodes dans la fonction main???????????????
Messages postés
3
Date d'inscription
jeudi 11 juin 2009
Statut
Membre
Dernière intervention
11 juin 2009

J'ai essaye ce code mais ca n marche pas complètement.

En effet, je fais une image blanche bitmap 24 bits sous paint et j'ajoute un rectangle noir par exemple.

En sortie j'affiche que les pixels noirs. Je n'obtiens pas exactement la forme rectangulaire dans la matrice de pixels que je récupère.

Merci
Messages postés
22
Date d'inscription
mardi 4 mars 2008
Statut
Membre
Dernière intervention
12 juillet 2008

j'ai essaye avecs ce code mais toujours j'ai un pb lors de l'execution et je trouve ce message:
load native agent library by full pathname
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
-splash:
show splash screen with specified image
j'ai besoin de m'aider comment regler ce pb.merci
Messages postés
750
Date d'inscription
mardi 9 mars 2004
Statut
Membre
Dernière intervention
23 décembre 2008
18
c'est pas faux :)
Afficher les 6 commentaires

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.