Citation :
// Enregistre une image dans un fichier : format bmp
int Save_BMP_Ex(char* nom_fichier,int largeur,int hauteur,GLubyte* mem) {
// Fichier bmp non compressé 24bits
FILE* fichier;
int position_tampon=54;
int position_image=0;
int taille_donnees_fichier=0;
int complement=0;
GLubyte* tampon=(GLubyte*)NULL;
// initialisation des données
complement=(largeur*3)%4;
if (complement>0) {
complement=4-complement;
}
taille_donnees_fichier=54+((largeur*3)+complement)*hauteur;
// création du tampon
tampon=(GLubyte*)malloc(sizeof(GLubyte)*taille_donnees_fichier);
if (tampon==(GLubyte*)NULL) {
return(0);
}
// remlissage du tampon
// entete
tampon[ 0]='B';
tampon[ 1]='M';
// taille du fichier
tampon[ 2]=taille_donnees_fichier & 255;
tampon[ 3]=(taille_donnees_fichier >> 8) & 255;
tampon[ 4]=(taille_donnees_fichier >> 16) & 255;
tampon[ 5]=(taille_donnees_fichier >> 24) & 255;
// inutilisé
tampon[ 6]=0;
tampon[ 7]=0;
tampon[ 8]=0;
tampon[ 9]=0;
// adresse des données
tampon[10]=54;
tampon[11]=0;
tampon[12]=0;
tampon[13]=0;
// taille de l'entete
tampon[14]=40;
tampon[15]=0;
tampon[16]=0;
tampon[17]=0;
// taille image : largeur et hauteur
tampon[18]=largeur & 255;
tampon[19]=(largeur >> 8) & 255;
tampon[20]=(largeur >> 16) & 255;
tampon[21]=(largeur >> 24) & 255;
tampon[22]=hauteur & 255;
tampon[23]=(hauteur >> 8) & 255;
tampon[24]=(hauteur >> 16) & 255;
tampon[25]=(hauteur >> 24) & 255;
// nombre de plan
tampon[26]=1;
tampon[27]=0;
// nombre de couleur
tampon[28]=24; // 24 bits
tampon[29]=0;
// format de compression (aucune=0)
tampon[30]=0;
tampon[31]=0;
tampon[32]=0;
tampon[33]=0;
// taille de l'image : ta mère
tampon[34]=0;
tampon[35]=0;
tampon[36]=0;
tampon[37]=0;
// resolution horizontale : 2834ppm
tampon[38]=18;
tampon[39]=11;
tampon[40]=0;
tampon[41]=0;
// resolution verticale : 2834ppm
tampon[42]=18;
tampon[43]=11;
tampon[44]=0;
tampon[45]=0;
// nombre de couleurs utilisées : ?
tampon[46]=0;
tampon[47]=0;
tampon[48]=0;
tampon[49]=0;
// nombre de couleurs importantes : ?
tampon[50]=0;
tampon[51]=0;
tampon[52]=0;
tampon[53]=0;
// image
for (int i=0;i<hauteur;i++) {
for (int j=0;j<largeur;j++) {
tampon[position_tampon ]=mem[position_image+2];
tampon[position_tampon+1]=mem[position_image+1];
tampon[position_tampon+2]=mem[position_image ];
position_tampon=position_tampon+3;
position_image=position_image+3;
}
position_tampon=position_tampon+complement;
}
// Ouverture du fichier
fichier = fopen(nom_fichier,"wb" );
if (fichier==(FILE*)NULL) {
free(tampon);
return(0);
}
// Ecriture du fichier
fseek(fichier,0,0);
if (fwrite(tampon,1,taille_donnees_fichier,fichier)!=taille_donnees_fichier) {
free(tampon);
return(0);
}
// fin
free(tampon);
fclose(fichier);
return(1);
}
|