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++).
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.