1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct enteteFichier enteteFichier;
struct enteteFichier{
char format [2]; //La signature indiquant le fichier BMP
unsigned int sizeFichier; //La taille totale du fichier en octets
unsigned int reserve; //reservé
unsigned int BMP_Off; //offset: adresse de début de l'image
};
typedef struct enteteImage enteteImage;
struct enteteImage{
unsigned int sizeEnteteImage; //taille de l'entète de l'image
unsigned int BMP_Width; //largeur de l'image en pixel
unsigned int BMP_Height; //hauteur de l'image en pixel
unsigned short planes; //Le nombre de plans vaut toujours 1
unsigned short bits_per_pixel; //nombre de bit pour le codage de la couleur
unsigned int compression; //méthode de compression
unsigned int sizeImage; //La taille totale de l'image en octets
unsigned int horiz_resolution; //nombre de pixels par mètre horizontalement
unsigned int vert_resolution; //nombre de pixels par mètre verticalement
unsigned int color_used; //Le nombre de couleurs de la palette
unsigned int important_color; //Le nombre de couleur important
};
typedef struct sCoul sCoul;
struct sCoul{
unsigned char R;
unsigned char V;
unsigned char B;
};
enteteFichier RecupEnteteFichier(FILE *fpin);
enteteFichier RecupEnteteFichier(FILE *fpin){
enteteFichier E1;
fread(&E1.format,2,1,fpin);
fread(&E1.sizeFichier,4,1,fpin);
fread(&E1.reserve,4,1,fpin);
fread(&E1.BMP_Off,4,1,fpin);
return E1;
}
enteteImage RecupEnteteImage(FILE *fpin);
enteteImage RecupEnteteImage(FILE *fpin){
enteteImage E1;
fread(&E1.sizeEnteteImage,4,1,fpin);
fread(&E1.BMP_Width,4,1,fpin);
fread(&E1.BMP_Height,4,1,fpin);
fread(&E1.planes,2,1,fpin);
fread(&E1.bits_per_pixel,2,1,fpin);
fread(&E1.compression,4,1,fpin);
fread(&E1.sizeImage,4,1,fpin);
fread(&E1.horiz_resolution,4,1,fpin);
fread(&E1.vert_resolution,4,1,fpin);
fread(&E1.color_used,4,1,fpin);
fread(&E1.important_color,4,1,fpin);
return E1;
}
int main ()
{
printf("Entrez le nom de l'image: ");
char *nomFichier;
int i=0,j=0;
FILE* f;
FILE* newFile;
enteteFichier EF;
enteteImage EI;
sCoul *couleurs=NULL;
sCoul *newColors=NULL;
printf("Entrez le nom de l'image: ");
scanf("%s",&nomFichier);
strcat(nomFichier,".bmp");
printf("%s\n",nomFichier);
f = fopen(nomFichier,"rb");
if (f == NULL){
printf ("Erreur ...");
exit(-1);
}
//recuperation de l'entete jusqu'a la longeur en pixels
EF = RecupEnteteFichier(f);
EI = RecupEnteteImage(f);
//pour commencer au debut de l'image
fseek(f, EF.BMP_Off, SEEK_SET);
i=0;
// allocation dynamique
couleurs=malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
while (!feof(f)){
// ici ca foire
fread(&couleurs[i], sizeof(sCoul), 1,f);
//les 10 premieres valeurs sont negatives !
if(i>=0&&i<11)
printf("%d\n",couleurs[i].B );
i++;
}
fclose(f);
newColors=malloc (EI.BMP_Width*EI.BMP_Height*sizeof(sCoul));
//modification des pixels c'est juste pour tester
while (j<i){
newColors[j].R=255-couleurs[j].R;
newColors[j].V=255-couleurs[j].V;
newColors[j].B-=255-couleurs[j].B;
if(j>=0&&j<11)
printf("%d\n",couleurs[j].B );
j++;
}
// je crée mon nouveau fichier
newFile = fopen("Resu.bmp", "wb");
if (newFile == NULL){
printf ("Erreur ...");
exit(-1);
}
fwrite(&EF, sizeof(enteteFichier),1,newFile);
fwrite(&EI, sizeof(enteteImage),1,newFile);
//doi je metre la pallette ??
j=0;
while(j<i){
fwrite(&newColors[j], sizeof(sCoul),1,newFile);
j++;
}
fclose(newFile); /* ajoute EOF au fichier et ferme le fichier */
// affichage de l'entete
printf("ENTETE DU FICHIER\n\n");
printf("Format: %c%c\n",EF.format[0],EF.format[1]);
printf("taille: %d octets\n",EF.sizeFichier);
printf("reservé: %d octets\n",EF.reserve);
printf("BMP_Off: %d octets \n",EF.BMP_Off);
printf("\nENTETE DE L'IMAGE\n\n");
printf("taille de l'entète de l'image: %d octets\n",EI.sizeEnteteImage);
printf("BMP_Height: %d pixels\n",EI.BMP_Height);
printf("BMP_Width: %d pixels\n",EI.BMP_Width);
printf("Le nombre de plans: %d \n",EI.planes);
printf("nombre de bit par pixel: %d bits\n",EI.bits_per_pixel);
printf("méthode de compression: %d \n",EI.compression);
printf("Taille total de l'image: %d octets\n",EI.sizeImage);
printf("Résolution horizontale: %d \n",EI.horiz_resolution);
printf("Résolution verticale: %d \n",EI.vert_resolution);
printf("Nombre de couleur utilisé: %d \n",EI.color_used);
if(EI.color_used!=0)printf("Nombre de couleur important: %d \n",EI.important_color);
printf("\n appuyez sur une touche\n");
printf("taille d'un entier %d \n",sizeof(int));
printf("taille d'un char %d \n",sizeof(char));
printf("taille d'un short %d \n",sizeof(short));
printf("taille d'un sCoul %d \n",sizeof(sCoul));
printf("taille d'un enteteFichier %d \n",sizeof(enteteFichier));
printf("taille d'un enteteImage %d \n",sizeof(enteteImage));
getch();
return EXIT_SUCCESS;
} |
Partager