Bonjour je programme sous ggcc (LINUX) et j'ai un petit pb avec mon programme j'arrive a mettre un texte dans l'image mais pas à faire le contraire
la fonction qui ne marche pas s'appelle retrievemessage
merci d'avance pour votre aide
#include <stdio.h>
typedef struct BMP_HEADER {
char identifier [2];
int filesize;
int reserved;
int dataoffset;
int headersize;
int width;
int height;
short int planes;
short int bitsperpixels;
int compression;
int bitmapdatasize;
int hresolution;
int vresolution;
int colors;
int importantcolors;
} BMP_HEADER;
int loadBitmapHeader (FILE *fichier, BMP_HEADER *entete) {
int res;
res = fread (&(entete -> identifier[0]), 1, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> identifier[1]), 1, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> filesize), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> reserved), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> dataoffset), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> headersize), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> width), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> height), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> planes), 2, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> bitsperpixels), 2, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> compression), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> bitmapdatasize), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> hresolution), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> vresolution), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> colors), 4, 1, fichier);
if (res != 1)
return 0;
res = fread (&(entete -> importantcolors), 4, 1, fichier);
if (res != 1)
return 0;
return 1;
}
int isBitmapHeaderCorrect (BMP_HEADER *header) {
if (header -> identifier[0] != 'B')
return 0;
if (header -> identifier[1] != 'M')
return 0;
if (header -> compression != 0)
return 0;
if (header -> bitsperpixels != 24)
return 0;
if (header -> bitmapdatasize != 3 * (header -> width) * (header->height))
return 0;
return 1;
}
int getBit (char *m, int n) {
char foo;
int i;
int res;
if ((n >= 0) && (n <= 8* strlen(m))){
foo = m [n/8];
for (i = 0; i < (7 - (n%8)); i++)
foo >>= 1;
if (foo%2 == 0)
res = 0;
else res = 1;
return res;
}
else return 0;
}
unsigned char * loadBitmapDatas(FILE *fichier, BMP_HEADER *header){
unsigned char * res = (unsigned char *) malloc(header->bitmapdatasize);
if (fread(res, 1 ,header->bitmapdatasize,fichier) != (header->bitmapdatasize))
return NULL ;
return res ;
}
int saveBitmapDatas(FILE *fichier, BMP_HEADER *header, unsigned char *pixels){
int res;
res = fwrite(header->identifier,1,2,fichier) ;
res = fwrite(&(header->filesize), 4,1,fichier) ;
res = fwrite(&(header->reserved), 4,1,fichier) ;
res = fwrite(&(header->dataoffset), 4,1,fichier) ;
res = fwrite(&(header->headersize), 4,1,fichier) ;
res = fwrite(&(header->width), 4,1,fichier) ;
res = fwrite(&(header->height), 4,1,fichier) ;
res = fwrite(&(header->planes),2,1,fichier) ;
res = fwrite(&(header->bitsperpixels),2,1,fichier) ;
res = fwrite(&(header->compression), 4,1,fichier) ;
res = fwrite(&(header->bitmapdatasize), 4,1,fichier) ;
res = fwrite(&(header->hresolution), 4,1,fichier) ;
res = fwrite(&(header->vresolution), 4,1,fichier) ;
res = fwrite(&(header->colors), 4,1,fichier) ;
res = fwrite(&(header->importantcolors), 4,1,fichier) ;
res = fwrite(pixels, 1 ,header->bitmapdatasize,fichier);
return 1;
}
int hideMessage (char *source, char *dest, char *message) {
FILE *fd = fopen (source, "r");
FILE *fd2 = fopen (dest, "w");
BMP_HEADER entete;
unsigned char *res;
int b;
int i;
loadBitmapHeader (fd, &entete);
res = loadBitmapDatas(fd, &entete);
for (i = 1; i <= (1 + strlen (message)) * 8; i++){
b = getBit (message, i);
if (res[i]%2 != b)
if (b == 1)
res[i]++ ;
else res[i]-- ;
}
saveBitmapDatas(fd2, &entete, res);
return 1;
}
/*char * retrieveMessage (char *source, char *original) { /*ne fonctionne pas !!*/
/* FILE *fd = fopen (source, "r");
FILE *fd2 = fopen (original, "r");
BMP_HEADER entete;
unsigned char *res = loadBitmapDatas(fd, &entete);
unsigned char *res2 = loadBitmapDatas(fd2, &entete);
int i = 0;
char b;
char b2;
b = res[i];
b2 = res2[i];
while (b != EOF) { /*on souhaite afficher les bits qui diffèrent entre les 2 fichiers afin de reconstituer le message*/
/* if (b != b2)
printf ("%c", b);
i++;
b = res[i];
b2 = res2[i];
}
}
*/
int main (void) {
/* FILE *fd = fopen ("3rdMay1808.bmp", "r");
if (fd==NULL){
printf("erreur") ;
return -1 ;
}
BMP_HEADER ent;
loadBitmapHeader (fd, &ent);
if (isBitmapHeaderCorrect (&ent) == 1)
printf ("l'entete est correcte\n\n");
else
printf ("l'entete est incorrecte\n\n");
printf ("Les 2 premiers octets sont: %c %c\n", ent.identifier[0], ent.identifier[1]);
printf ("La taille du fichier est: %d\n", ent.filesize);
printf ("Champs réservés: %d\n", ent.reserved);
printf ("Nb octets séparant le début du fichier des données de l'image: %d\n", ent.dataoffset);
printf ("Largeur en pixels: %d\n", ent.width);
printf ("Largeur en pixels: %d\n", ent.height);
printf ("Nb de bits pour représenter un pixel: %d\n", ent.bitsperpixels);
printf ("Type de compression: %d\n", ent.compression);
printf ("Taille en octets des données de l'image: %d\n", ent.bitmapdatasize);
fclose (fd);*/
hideMessage ("3rdMay1808.bmp", "essai.bmp", "tony et remy sont fort en c"); /* on dissimule le message, mais en l'état engendre une segmentation fault */
/* retrieveMessage ("essai.bmp", "3rdMay1808.bmp");*/
return 0;
}