Problème lecture BMP

Fermé
alpha - 7 juin 2014 à 15:51
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 juin 2014 à 21:15
Bonjour,

Je viens de faire un programme qui lit les informations d'un BMP (cf. ici (https://www.commentcamarche.net/contents/1200-bmp-format-bmp pour plus de détails).
Mais ne m'affiche pas ce que je veux. Dès le deuxième printf sa foire (i m'affiche une taille de 0 octet).

#include <stdio.h>
#include <stdlib.h>

#include "constants.h"

typedef struct {

    /* Entête du fichier */
    unsigned char signature[2]; /* Signature sur 2 octets */
    unsigned int fsize; /* Taille du fichier sur 4 octets */
    unsigned int field; /* Champ réservé sur 4 octets */ 
    unsigned int offset; /* Adresse de départ de l'image sur 4 octets */

    /* Entête de l'image */
    unsigned int hsize; /* Taille de l'entête de l'image sur 4 octets */
    unsigned int width; /* Largeur de l'image sur 4 octets */
    unsigned int height; /* Hauteur de l'image sur 4 octets */
    unsigned int plane; /* Nombre de plan sur 2 octets */
    unsigned int bits; /* Profondeur de codage de la couleur (nombres de bits) sur 2 octets */
    unsigned int compression; /* Méthode de compression de l'image sur 4 octets */
    unsigned int isize; /* Taille de l'image sur 4 octets */
    unsigned int wresolution; /* Résolution horizontale sur 4 octets */
    unsigned int hresolution; /* Resolution verticale sur 4 octets */
    unsigned int cnumber; /* Nombre de couleurs de la palette sur 4 octets */
    unsigned int icnumber; /* Nombre de couleurs importante de la palette sur 4 octets */

    /* Palette de l'image */

    /* Codage de l'image */

} BMP;

void BmpInfo(BMP bmp)
{
    clrsrc();

    printf("Information relative au fichier :\n\n");

    printf("Type de fichier : ");
        if(bmp.signature[0] == 'B' && bmp.signature[1] == 'M')
            printf("Bitmap Windows\n");
        else if(bmp.signature[0] == 'B' && bmp.signature[1] == 'A')
            printf("Bitmap OS/2\n");
        else if(bmp.signature[0] == 'C' && bmp.signature[1] == 'I')
            printf("Icone couleur\n");
        else if(bmp.signature[0] == 'C' && bmp.signature[1] == 'P')
            printf("Pointeur de couleur\n");
        else if(bmp.signature[0] == 'I' && bmp.signature[1] == 'C')
            printf("Icone\n");
        else if(bmp.signature[0] == 'P' && bmp.signature[1] == 'T')
            printf("Pointeur\n");

    printf("Taille du fichier : %u o\n", bmp.fsize);
    printf("Champ réservé : %u\n", bmp.field);
    printf("Offset : %u\n", bmp.offset);
    printf("Entête de l'image : %u\n", bmp.hsize);
    printf("Largeur de l'image : %u\n", bmp.width);
    printf("Hauteur de l'image : %u\n", bmp.height);
    printf("Nombre de plan : %u\n", bmp.plane);
    printf("Nombre de bits : %u\n", bmp.bits);
    printf("Type de compression : %u\n", bmp.compression);
    printf("Taille de l'image : %u\n", bmp.isize);
    printf("Résolution horizontale : %u\n", bmp.wresolution);
    printf("Résolution verticale : %u\n", bmp.hresolution);
    printf("Nombre de couleurs : %u\n", bmp.cnumber);
    printf("Nombre de couleurs importante : %u\n", bmp.icnumber);

}   

int main(void)
{
    int i = 0;
    FILE *image = NULL;
    BMP bmp = {0};

    image = fopen("image.bmp", "rb");
    if(image != NULL)
    {
        fread(&bmp, sizeof(bmp), 1, image);

        if((bmp.signature[0] == 'B' && bmp.signature[1] == 'M') || \
           (bmp.signature[0] == 'B' && bmp.signature[1] == 'A') || \
           (bmp.signature[0] == 'C' && bmp.signature[1] == 'I') || \
           (bmp.signature[0] == 'C' && bmp.signature[1] == 'P') || \
           (bmp.signature[0] == 'I' && bmp.signature[1] == 'C') || \
           (bmp.signature[0] == 'P' && bmp.signature[1] == 'T'))
               BmpInfo(bmp);
        else
        {
            printf("Problème lors de la lecture du fichier\n");
            printf("Le fichier ne semble pas correspondre au type de fichier demandé\n");
        }

        fclose(image);
    }
    else
    {
        printf("Unable to load image.bmp\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

A voir également:

2 réponses

Bonjour,

Essayez de passer l'adresse de la variable BMP à la fonction :

BMP bmp = {0}

void BmpInfo(BMP* lpbmp)
{
// pour atteindre les champs :
// lpbmp->signature[0] == 'B'
}

pour appeler la fonction :

BmpInfo(&bmp);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
7 juin 2014 à 21:13
Ca ne changera rien...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
7 juin 2014 à 21:15
Bonjour,

Qu'appelles-tu "i" qui te retourne "0" ?
Sinon, tu devrais déjà tester le retour de fread(). Peut-être un problème avec le fichier bmp...
0