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
| #include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
printf(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf("º#########################################º\n");
printf("º# #º\n");
printf("º# Changer une image BMP couleur en une #º\n");
printf("º# image BMP avec différent niveaux de #º\n");
printf("º# gris, en utilisant l'allocation #º\n");
printf("º# dynamique. #º\n");
printf("º# #º\n");
printf("º#########################################º\n");
printf(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n\n");
//Déclaration des variables
int test = 0, largeur = 0, hauteur = 0, taille = 0, taillekilo = 0;
int i = 0, val = 0;
unsigned char * imagegrey = NULL;
unsigned char buffer[100];
FILE *imA; // Image mario.bmp
FILE *imB; // Image mariogrey.bmp
// Ouverture de mario.bmp
imA = fopen( "images\\mario.bmp", "r+b" );
if( imA == NULL )
{
puts("Impossible d'ouvrir !\n");
return 1;
}
// Ouverture de mariogrey.bmp et création si elle n'existe pas
imB = fopen( "images\\mariogrey.bmp", "w+b" );
if(imB==NULL)
{
puts("Impossible d'ouvrir !\n");
return 1;
}
// Lecture et récupération de l'entete de mario.bmp
test = fread(buffer,54,1,imA);
// Je teste ensuite si la lecture s'est bien effectuée
if( test == 0 )
{
puts("Impossible de lire le fichier !\n");
return 1;
}
// Recopiage de l'entete de mario.bmp dans celle de mariogrey.bmp
test = fwrite(buffer,54,1,imB);
if( test == 0 )
{
puts("Impossible d'ecrire dans le fichier !\n");
return 1;
}
// Recherche de la hauteur et de la largeur de l'image
fseek(imB,0x12,SEEK_SET);
// Récupération de le largeur de l'image de mariogrey.bmp
fread(&largeur,4,1,imB);
// Récupération de la hauteur de l'image de mariogrey.bmp
fread(&hauteur,4,1,imB);
printf(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n");
printf("º#######################################################º\n");
printf("º# Affichage des informations concernant mariogrey.bmp #º\n");
printf("º# #º\n");
// Affichage des valeur récupérées précedemment
printf("º# Largeur : %d #º\n", largeur );
printf("º# Hauteur : %d #º\n", hauteur );
// Calcul de la taille de l'image en octets...
taille = largeur*hauteur*3 ;
taillekilo = taille/1024;
// ...et affichage de sa valeur
printf( "º# Taille de mariogrey.bmp : %d octects #º\n",taille );
printf( "º# Soit : %d Ko #º\n",taillekilo );
printf("º#######################################################º\n");
printf(" ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n\n");
// On fait une allocation dynamique du tableau image du nombre d'octets calculés precedement
imagegrey = (unsigned char *)malloc(taille);
// On vérifie si l'allocation a marché ou pas
if (imagegrey == NULL)
{
// Si non, on arrete tout ! mouahahah ( désolé il est tard :( )
exit(0);
}
// On remplit le tableau imagegrey avec le contenu image de mario.bmp
test=fread(imagegrey,taille,1,imA);
if(test==0)
{
puts("Fin de fichier ou erreur de lecture imagegrey !\n");
}
// On Convertit le tableau imagegrey en niveau de gris
i = 0;
while ( i < taille ){
// Val prend la moyenne des couleurs primaires
val=(imagegrey[i]+imagegrey[i+1]+imagegrey[i+2])/3;
imagegrey[i]=val;
imagegrey[i+1]=val;
imagegrey[i+2]=val;
i = i + 3;
}
// Déplacement au début des octets image
fseek(imB,54,SEEK_SET);
// On ecrit le tableau imagegrey dans mariogrey.bmp
test = fwrite(imagegrey,taille,1,imB);
// On libère la mémoire allouée avec malloc, on n'en a plus besoin
free(imagegrey);
//Message de fin
printf("Voila, votre image a ete convertit en niveaux de gris !\n");
printf("Elle s'appelle mariogrey.bmp !");
// Fermeture des fichier mario et mariogrey
test = fclose(imA);
if ( test == EOF )
{
puts( "Impossible de fermer le fichier!!\n" );
return 1;
}
test = fclose(imB);
if( test == EOF )
{
puts("Impossible de fermer le fichier !\n");
return 1;
}
getchar();
return 0;
} |
Partager