Binariser un bmp [vc++]

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

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.