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 :

Problème de création d'un fichier BMP


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Problème de création d'un fichier BMP
    Bonjour.

    Dans le cadre d'un travail, je dois effectuer des transformations sur des fichiers de type BMP. Suivant un algorithme particulier, je dois transformer l'image dans une boucle jusqu'à retrouver l'image de base. Chaque image sera individuellement enregistrée dans un nouveau fichier qui sera à nouveau traité.

    Après moult essais, je constate quelques problèmes au niveau de la simple ouverture de mon fichier bitmap, lecture de celui-ci et réécriture dans un nouveau fichier.

    En effet, pour la réécriture de mon fichier se fait en 2 étapes.

    1. Je prends l'entête du fichier bmp (soit 54 octets) que je réécris dans mon fichier.
    2. Je prends le reste du fichier (taille de 256*256*3 octets (chaque pixel étant codé sur 3 octets), soit 196608 octets)

    Lors de la réécriture de l'entête dans mon nouveau fichier, je n'ai aucun problème.

    Lors de la réécriture du reste de mon fichier à partir de la fin de l'entête, j'ai quelques problèmes.

    Je passe tout d'abord par un tableau alloué dynamiquement avec cette ligne, sizemalloc étant égal à 256*256*3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* tab = (char*) malloc(sizemalloc);
    Je lis ensuite mon fichier à partir de la 54ième position de mon fichier BMP (le fichier étant composé de 256*256*3+54 octets de données (entête + données))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // On se positionne à la fin de l'entête
                fseek(origiBMPFile, 54, SEEK_SET);
     
                // On copie complètement le contenu du fichier, à partir de l'entête dans le tableau;
                fread(tab, 1, sizemalloc, origiBMPFile);
    Il apparait que l'image enregistrée est déformée par rapport à l'image d'origine, les couleurs déplacées et j'en passe. Le fichier comporte en plus une taille un peu plus grosse (663 octets)

    En effectuant une analyse hexadécimale parallèle de mon fichier BMP original et de mon fichier BMP créé, il apparait que certains caractères particuliers se glissent lorsque mon fichier est recopié. En effet, à chaque fois que je rencontre le caractère "0a", le caractère "0d" vient s'insérer juste devant.

    Ces caractères correspondent aux caractères "Saut de ligne" et "Retour chariot".

    J'aimerais comprendre pourquoi justement ce caractère Carriage Return vient s'insérer dans mon code.

    Je passe toujours par un fread pour lire et un fwrite pour écrire. J'avais essayé une technique avec un fgetc et un fputc, mais elle ne fonctionnait par pour lire et écrire dans le fichier, d'où la raison pour laquelle je suis passé par un fread et un fwrite.

    Pouvez-vous m'aider à résoudre ce mystère ? D'avance je vous remercie.

    Cordialement,

    Gandalf2008

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Les fichiers sont ils bien ouverts en mode binaire ?
    Rappel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* mode texte */
    /* lecture */
    fopen(..., "r");
    /* écriture*/
    fopen(..., "w");
    /* mode binaire */
    /* lecture */
    fopen(..., "rb");
    /* écriture */
    fopen(..., "wb");

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour, et merci de votre réponse.

    Il semblerait que mis à part une erreur d'algorithme, mon erreur viendrait de là.

    Pouvez-vous m'en expliquer la raison ?

    Encore merci de cette rapidité.

    Cordialement,

    Gandalf2008

  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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Depuis les débuts de l'informatique, les pères fondateurs ont juste oublié de normaliser les caractères qui figurent la fin de ligne (ou alors les éditeurs n'ont pas voulu écouter et n'en ont fait qu'à leur tête).

    Sur PC, Unix et MAC, les caractères de fin de ligne sont différents (CR, CR et LF ou LF).

    Les fonctions de traitement des fichiers en mode texte sont là pour simplifier la vie et faire abstraction de ces différences en ajoutant ou en supprimant les bons caractères pour s'adapter à la machine.

    Le problème est que dans un fichier binaire, (un fichier BMP est un fichier binaire), ces fonctions "mode texte" vont continuer à jouer leur rôle et donc vont rajouter ou supprimer des caractères en présence des caractères CR et/ou LF.

    Quand on travaille sur un fichier binaire, il fait donc désactiver ce mode et utiliser la gestion de fichier en mode binaire (sans interprétation donc).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Et bien... Merci à vous deux.

    Si seulement j'avais su que j'allais avoir autant de fil à retordre sur ce genre de problème alors que la solution était à portée de main...

    Encore un grand merci !!

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème à la création d'un fichier
    Par -Zou- dans le forum C#
    Réponses: 4
    Dernier message: 03/04/2013, 23h20
  2. Problème de création d'une image BMP à partir d'un byte[]
    Par Dark_Alex69 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 28/03/2010, 16h32
  3. Création d'un fichier .bmp avec PrintWindow
    Par Irken dans le forum Windows
    Réponses: 8
    Dernier message: 05/09/2007, 18h03
  4. Problème à la création d'un fichier d'aide
    Par kurul1 dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/02/2007, 15h49
  5. Réponses: 1
    Dernier message: 20/10/2005, 10h32

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