IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lire un fichier BMP


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut Lire un fichier BMP
    Bonjour/Bonsoir à tous,

    j'ai un petit problème lors de la lecture d'un fichier .bmp sous windows, voici mon code,
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #pragma pack(push, 1)
     
    typedef unsigned char uc;
    typedef unsigned int ui;
    typedef unsigned short us;
     
    typedef struct
    {
        uc r;
        uc g;
        uc b;
        uc reserved;
    }Color;
    typedef struct
    {
        uc signature[2];
        ui leng;
        ui reserved;
        ui offset;
        ui taille;
        ui largeur;
        ui hauteur;
        us nplans;
        us nbits;
        ui compression;
        ui taille_img;
        ui Hres;
        ui Vres;
        ui ncolor;
        ui nimportantcolor;
        Color  palette;
    }BMP;
     
    void ShowTypes(void)
    {
        printf("int=%d Octes\n",sizeof(int));
        printf("unsigned int=%d Octes\n",sizeof(unsigned int));
        printf("char=%d Octes\n",sizeof(char));
        printf("unsigned char=%d Octes\n",sizeof(unsigned char));
        printf("short=%d Octes\n",sizeof(short));
        printf("unsigned short=%d Octes\n",sizeof(unsigned short));
        printf("long=%d Octes\n",sizeof(long));
        printf("unsigned long=%d Octes\n",sizeof(unsigned long));
        system("pause");
    }
    void ShowBMPInfo(BMP img)
    {
        printf("Entete du fichier\n");
        printf("------------------\n");
        printf("Signature du fichier: %c%c\n"\
               "Taille du fichier: %d Ko\n"\
               "Champ reserve: %d\n"\
               "Offset: %d\n\n",img.signature[0],img.signature[1],img.leng/1000,img.reserved,img.offset);
        printf("Entete de l'image\n");
        printf("------------------\n");
        printf("Largeur: %d\n"\
               "Hauteur: %d\n"\
               "Nombre de plans: %d\n"\
               "Nombre de bits: %d Bits\n"\
               "Type de compression: %d\n"\
               "Taille de l'image: %d Ko\n"\
               "Resolution Horizontale: %d\n"\
               "Resolution Verticale: %d\n"\
               "Nombre de couleur: %d\n"\
               "Nombre de couleurs importante: %d\n\n",img.largeur,img.hauteur,img.nplans,img.nbits,img.compression,img.taille_img/1000,img.Hres
               ,img.Vres,img.ncolor,img.nimportantcolor);
        printf("Entete de la palette\n");
        printf("------------------\n");
        printf("couleur R: %d\n"\
               "couleur G: %d\n"\
               "couleur B: %d\n"\
               "reserved: %d\n\n",img.palette.r,img.palette.g,img.palette.b,img.palette.reserved);
    }
     
    int main(int argc,char** argv)
    {
        FILE* fichier=NULL;
        FILE *f=NULL;
        ui i,j;
     
        BMP img;
        BMP *imgcpy=malloc(sizeof(BMP));;
        uc data[640][428]={{0}};
     
        fichier=fopen("image.bmp","rb");
        f=fopen("imagecpy.bmp","wb");
     
        if (fichier!=NULL)
        {
            fread(&img,sizeof(img),1,fichier);/*on lit les infos sur l'image*/
            memcpy(imgcpy,&img,sizeof(BMP));
            fread(data,sizeof(data),1,f);
            if (img.signature[0]=='B' && img.signature[1]=='M')
            {
                ShowBMPInfo(img);
                fwrite(imgcpy,sizeof(BMP),1,f); /* on enregistre les infos du header*/
                fwrite(data,sizeof(data),1,f);/* on enregistre les données iamges*/
            }
            else
            {
                printf("ce fichier n'est pas un fichier bmp\n");
            }
        }
        else printf("impossible d'ouvrir le fichier");
     
        getchar();
        fclose(fichier);
        fclose(f);
     
        (void)argc;
        (void)argv;
        return 0;
    }
    Donc le problème quand j'enregistre mon fichier BMP il m'enregistre 268Ko or le fichier d'origine fait 803Ko
    Merci d'avance

    EDIT: petite précision je sais j'ai déclaré un tableau statique mais c'est juste pour tester

    La structure que j'ai créer contient les informations sur l'entete du fichier et l'entete de l'image dans la fonction main uc data[640][428] correspond au données de l'image (l'image fait 640 de largeur et 428 de hauteur)

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ben c'est un peu normal

    quand tu enregistres ton fichier, tu enregistres le header BMP et 1 seule fois les données. sizeof(uc) = 640*428=273920 octets.

    Il faudrait lire toutes les données de ton fichier (dans une boucle while) et les écrire toujours dans la même boucle.

    Autre chose,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        (void)argc;
        (void)argv;
    A la fin de ton main, c'est pour je suppose supprimer le warning parce que tu n'utilises pas ces paramètres, c'est très bien (cela veut au moins dire que ton compilateur est bien réglé).

    Essaye comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int /*argc*/, char** /*argv*/)
    {
    ...
    C'est moins perturbant (je trouve) et cela a le même effet
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Essaye comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int /*argc*/, char** /*argv*/)
    {
    ...
    C'est moins perturbant (je trouve) et cela a le même effet
    J'aurais plutôt dit de les supprimer soit
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    J'aurais plutôt dit de les supprimer soit
    J'aime bien garder la forme avec argc et argv même si je ne les utilise pas et même si main(void) est autorisé.

    Et puis il y a d'autres cas (dans d'autres fonctions, pas forcemment avec main) où un des paramètres n'est pas utilisé, autant apprendre les bonnes pratiques.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Merci bcp ça marche mais je remarque qu'il me manque 3 octets par rapport au fichier original n'empêche je peux lire l'image que j'ai copié,cependant j'ai une question:
    la première fois que j'ai testé j'ai fait comme ça
    while((fread(data,sizeof(data),1,fichier))!=0)
    {
    fwrite(data,sizeof(data),1,f);/* on enregistre les données iamges*/
    }
    ça n'as pas marché alors qu'avec celle-ci ça marche:
    while((fread(data,1,sizeof(data),fichier))!=0)
    {
    fwrite(data,1,sizeof(data),f);/* on enregistre les données iamges*/
    }
    Quelqu'un peux m'expliquer ça ?
    Merci d'avance

    EDIT: pour ce qui est des paramètres de la fonctions main merci, je préfère aussi laissé les paramètres au lieu d'un void

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((fread(data,sizeof(data),1,fichier))!=0)
    Là, tu essayes de lire 1 bloc de 273920 octets, s'il n'en reste pas assez dans le fichier à lire, cela retourne 0 et il te manque la fin du fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((fread(data,1,sizeof(data),fichier))!=0)
    Là, tu essayes de lire 273920 blocs de 1 octets, s'il n'en reste pas assez dans le fichier à lire, cela retourne le nombre de blocs lus (octets dans ton cas puisque taille=1) et tu peut compléter ton fichier.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Essaye comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(int /*argc*/, char** /*argv*/)
    {
    ...
    C'est moins perturbant (je trouve) et cela a le même effet
    C'est du C++ je suppose , en C tu peux faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int main( void )
    {
    ...

    Edit :
    Grillé, j'essaierais de taper plus vite à l'avenir.

Discussions similaires

  1. Lire et créer des fichiers BMP
    Par Ketchup666 dans le forum C++
    Réponses: 12
    Dernier message: 04/04/2007, 15h38
  2. Lire les fichiers BMP
    Par renovator dans le forum MFC
    Réponses: 1
    Dernier message: 05/07/2006, 15h17
  3. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29
  4. [TP]Charger un fichier bmp
    Par flavien tetart dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 30/06/2002, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo