Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BINARISER UN BMP [VC++]


Information sur la source

Catégorie :Graphique Niveau : Débutant Date de création : 18/03/2003 Date de mise à jour : 18/03/2003 23:10:45 Vu : 4 251

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

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

  • #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;
#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-&gt;C/C++-&gt;code generation-&gt;struct member alignment :: pour vc++).
 

Commentaires et avis

signaler à un administrateur
Commentaire de nicoloyo le 28/10/2003 21:12:44

Je vais peut-être avoir l'air bête mais à quoi ça sert?
Est-ce réverssible?
Ca veut dire quoi binariser?

Merci!

signaler à un administrateur
Commentaire de kisscool19812002 le 22/09/2004 11:21:05

ca veut dire qu'il a la gaule en voyant les seins dla meuf en binaire

signaler à un administrateur
Commentaire de abdoulax le 02/04/2008 16:50:17

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!

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.