Binariser un bmp [vc++]

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 038 fois - Téléchargée 35 fois

Contenu du snippet

Permet de binariser un fichier bmp. Le code ne transforme pas la palette mais chaques pixels de l'image.
J'utilise un fichier entetebmp.h qui contient des structures permettant de recupérer les entetes et la palette.

Source / Exemple :


#include <iostream>
#include "entetebmp.h"

char bin_bmp (char src[], char dest[])
{
	BMPINFO entete;//premiere partie de l'entete
	WININFOHEAD entete2;//deuxieme partie
	WINRGBQUAD * palette;//ptr sur la palette de couleurs
	unsigned char * image;//ptr sur le buffer de l'image
	unsigned int taille_image=0;//taille de l'image en octet
	char erreur=0;

	FILE* ptr_src;//pointeur sur le fichier source
	FILE* ptr_dest;//pointeur sur le fichier destination

	if((ptr_src=fopen(src,"rb"))!=NULL)
	{
		//recup les infos
		fread(&entete,sizeof(BMPINFO),1,ptr_src);

		//verife si bmp
		if(entete.Type==0x4d42)
		{
			fread(&entete2,sizeof(WININFOHEAD),1,ptr_src);

			//on creer un buffer pour stocker la palette
			palette=new WINRGBQUAD[entete2.ClrUsed];

			fread(palette,sizeof(WINRGBQUAD),entete2.ClrUsed,ptr_src);
			taille_image=((entete2.Height*entete2.Width)*(entete2.BitCount/8));
			
			//on creer un buffer pour stocker l'image
			image=new unsigned char[taille_image];

			//on recupere
			fread(image,sizeof(char),taille_image,ptr_src);
			fclose(ptr_src);

			//on binarise a 0x80
			for(int i=0; i!=taille_image; i++)
				if(image[i]<0x80)
					image[i]=0x00;
				else
					image[i]=0xff;

			//ouvre ou creer le fichier de destination
			if((ptr_dest=fopen(dest,"wb"))!=NULL)
			{
				fwrite(&entete,sizeof(BMPINFO),1,ptr_dest);
				fwrite(&entete2,sizeof(WININFOHEAD),1,ptr_dest);
				fwrite(palette,sizeof(WINRGBQUAD),entete2.ClrUsed,ptr_dest);
				fwrite(image,sizeof(char),taille_image,ptr_dest);
				fclose(ptr_dest);
			}
			else
				erreur=3;//pb ac fichier destination
			//libere la memoire
			delete []palette;
			delete []image;
		}
		else
			erreur=1;//le fichier n'est pas un bmp
	}
	else
			erreur=2;//pb ac fichier source

	
	return(erreur);
}

/***********************************************************

                                  • FICHIER entetebmp.h ************************
                                                                                                                      • /
/*
    • BMP File Format Bitmap Header.
  • /
typedef struct _BmpInfo /* Offset Description */ { WORD Type; /* 00h File Type Identifier (4D42h) */ DWORD FileSize; /* 02h Size of File */ WORD Reserved1; /* 06h Reserved (should be 0) */ WORD Reserved2; /* 08h Reserved (should be 0) */ DWORD Offset; /* 0Ah Offset to bitmap data */ } BMPINFO; /*
    • Windows 3.x Information Header Format.
  • /
typedef struct _WinInfoHeader /* Offset Description */ { DWORD Size; /* 0Eh Size of Remianing Header */ DWORD Width; /* 12h Width of Bitmap in Points */ DWORD Height; /* 16h Height of Bitmap in Points */ WORD Planes; /* 1Ah Number of Planes */ WORD BitCount; /* 1Ch Bits Per Point */ DWORD Compression; /* 1Eh Compression Scheme (0=none) */ DWORD SizeImage; /* 22h Size of bitmap in bytes */ DWORD XPelsPerMeter; /* 26h Horz. Resolution in Points/Meter */ DWORD YPelsPerMeter; /* 2Ah Vert. Resolution in Points/Meter */ DWORD ClrUsed; /* 2Eh Number of Colors in Color Table */ DWORD ClrImportant; /* 32h Number of Important Colors */ } WININFOHEAD; /*
    • Windows 3.x RGB Color Quadruple.
  • /
typedef struct _WinRgbQuad { BYTE rgbBlue; /* Blue Intensity Value */ BYTE rgbGreen; /* Green Intensity Value */ BYTE rgbRed; /* Red Intensity Value */ BYTE rgbReserved; /* Reserved (should be 0) */ } WINRGBQUAD;

Conclusion :


A noter qu'il faut que dans les options de compilation aligner les structures sur 1 ou 2 octets (project settings->C/C++->code generation->struct member alignment :: pour vc++).

A voir également

Ajouter un commentaire

Commentaires

faux.
Whismeril
Messages postés
13951
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 novembre 2019
319 > zboubaubeurre -
Merci de ne pas poster de commentaires en double.
Par contre "faux" ou "efectivement c'est faux" ne permet pas aux autres visiteurs de savoir quel est le problème.
Peux tu être plus explicite?
cagne
Messages postés
1
Date d'inscription
dimanche 23 septembre 2012
Statut
Membre
Dernière intervention
24 septembre 2012
-
bonjour,
où peut-on trouver le fichier "entetebmp.h"
merci
odumange
Messages postés
1
Date d'inscription
lundi 2 janvier 2006
Statut
Membre
Dernière intervention
3 mars 2010
-
bon code
abdoulax
Messages postés
875
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
22 juin 2012
-
Merci, sa me sauve la vie... Perso sa va me servir à afficher une image BMP sur un écran d'un système embarqué. Alors Kisscool va joué au bille!

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.