Bonjour à tous,

Voila j'ai un petit soucis avec mon code.
Ce code est censé transformé une image BMP couleur en une image BMP avec niveaux de gris.

Le problème est que ca me creer mon image en gris mais lorsque je l'ouvre, ca me dit affichage echoué.

un peu d'aide ?

L'image que je dois modifier est à cette adresse :

http://magicbart.free.fr/images/jeu/...ubledash01.bmp

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int main()
{
    //Déclaration des variables
    int test = 0, largeur = 0, hauteur = 0, taille = 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( "mario.bmp", "r+" );
    if( imA == NULL )
    {
        puts("Impossible d'ouvrir !\n");
        return 1;
    }
 
    // Ouverture de mariogrey.bmp et création si elle n'existe pas
    imB = fopen( "mariogrey.bmp", "w+" );
    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);
    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);
 
    // 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 ;
 
    // ...et affichage de sa valeur
    printf( "Taille de mariogrey.bmp : %d\n",taille );
 
    // 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;
    }
 
    // 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 été 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;
}