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 :

chargement fichier bizarre


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut chargement fichier bizarre
    La classe image est une classe me permettant de traiter des images.
    De ce cote la elle a ete utilise de nombreuses fois et tout est ok.
    Ce code, je tiens a la presise a ete deja utilise et tournais !
    Il se trouve actuellement insere dans un widget Qt mais j en epense pas que cela vienne de la
    voila 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
     
      FILE * FILEIN;
      FILE * FILEIN2;
      unsigned char mot[4];
     
      FILEIN = fopen(ima1,"rb");
      FILEIN2 = fopen(ima2,"rb");
     
      fread(mot,2,1,FILEIN); //BM  
      fread(mot,4,1,FILEIN); //taille de l image
      taille=(int)convWrd(mot);
      fseek(FILEIN,10L,SEEK_SET);
      fread(mot,4,1,FILEIN); //longueur de l image
      data=(int)convWrd(mot);
      fseek(FILEIN,18L,SEEK_SET);
      fread(mot,4,1,FILEIN); //hauteur de l image
      longueur=(int)convWrd(mot);
      fread(mot,4,1,FILEIN);
      largeur=(int)convWrd(mot);      
     
      fseek(FILEIN,0,SEEK_SET);
      bmp=(unsigned char *)malloc(taille*sizeof(unsigned char));
      unsigned char entete[data];
      fread(entete,data,1,FILEIN);
      memcpy(bmp,entete,data*sizeof(unsigned char));
     
      fseek(FILEIN,data,SEEK_SET);
      unsigned char in[taille-data];
      fread(in,taille-data,1,FILEIN);
      for (int i=data; i<taille; i++)
        bmp[i]=in[i-data];		
      image1 = new BMP(longueur, largeur, in);
      imapt1 = new BMP(longueur, largeur, in);
      image2 = new BMP(longueur, largeur,in);
      imapt2 = new BMP(longueur, largeur,in);
      imavx = new BMP(longueur, largeur,in);
      imavy = new BMP(longueur, largeur,in);
      imacor = new BMP(longueur, largeur,in);
      fclose(FILEIN);	       
     
      fseek(FILEIN2,data,SEEK_SET);
      fread(in,taille-data,1,FILEIN2);// c ici que tout se passe !
      image2->setData(in);
      imapt2->setData(in);
      fclose(FILEIN2);
    lors de l'affichage des image tout est OK pour image1, imapt1, etc...
    mais les images image2 et imapt2 sont brouiilees (?)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Merci d'utiliser les balises Code pour coller ton code, c'est plus lisible.

    Tu ne nous dis pas vraiment ce que ton code est censé faire alors pour t'aider c'est pas évident.
    Mais as tu vérifié des trucs simples :
    - l'image que tu cherches à visualiser est-elle valide ? Arrives-tu à la voir avec un logiciel de traitement d'image fiable ?
    - est-tu sûr de tes paramètres (longueur, largeur ...) pour cette image ?
    - si tu cherches à ouvrir le fichier correspondant à image1 avec le code destiné à image2, as-tu le même résultat qu'avec le code destiné à image1 ?

    Le format BMP est un format brutal, si je ne me trompe. Les données de chaque pixel sont mise bout à bout dans le fichier. Donc tu devrais assez facilement pouvoir vérifier que tu as pour chaque pixel les valeurs attendues en débuguant pas à pas.
    Parce que si tu dis que ce code a été éprouvé par les années, je pencherais plutôt pour accuser le fichier image. Et si c'est brouillé, ma première idée est que tu as un décalage dans la lecture des pixels.
    Tu peux aussi essayer de lire une image simple qui ferait 100x100 pixels qui serait composée d'une ligne rouge, une ligne bleue, une rouge, une bleue, etc... Ainsi, tu pourrais mieux détecter si il y a effectivement un décalage ou si c'est un autre problème.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    en fait c un code tres simple qui me sertjuste a charger dans des classes le contenu des images.
    j'ai teste et verifie tous les trucs de base.
    les images sont valides, et seule le deuxeieme chargement pose probleme meme en inversant les images .
    Mes parametres sont sur et le resultat ne depend pas de la taille de l'image

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Question bête : Es-tu certain que les deux images ont les mêmes dimensions ?

    A part ça, puisque tu utilises Qt, pourquoi n'utilises-tu pas les fonctions Qt pour lire des fichiers images ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    j'ai simplifier le code qui ne tourne toujours pas , le voici
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "image.h"
    #include "utils.h"
    #include "skel.h"
     
    int main(int argc, char **argv)
    {
      FILE * FILEIN;
      FILE * FILEIN2;
      FILE * FILEOUT;
      unsigned char mot[4];
      int longueur, largeur, taille, data;     
      BMP *image1;
      BMP *image2;
      BMP *imapt1;
      BMP *imapt2;
      //unsigned char *bmp;   
     
      FILEIN = fopen(argv[1],"rb");
      FILEIN2 = fopen(argv[2],"rb");
     
      fread(mot,2,1,FILEIN); //BM  
      fread(mot,4,1,FILEIN); //taille de l image
      taille=convWrd(mot);
      fseek(FILEIN,10L,SEEK_SET);
      fread(mot,4,1,FILEIN); //longueur de l image
      data=convWrd(mot);
      fseek(FILEIN,18L,SEEK_SET);
      fread(mot,4,1,FILEIN); //hauteur de l image
      longueur=convWrd(mot);
      fread(mot,4,1,FILEIN);
      largeur=convWrd(mot);      
     
      printf("%s\t %dx%d : %d octets\n",argv[2],longueur,largeur,taille);
     
      fseek(FILEIN,0,SEEK_SET);
      //bmp=(unsigned char *)malloc(taille*sizeof(unsigned char));
      unsigned char bmp[taille];
      unsigned char entete[data];
      fread(entete,data,1,FILEIN);
      memcpy(bmp,entete,data*sizeof(unsigned char));
     
      fseek(FILEIN,data,SEEK_SET);
      unsigned char in[taille-data];
      fread(in,taille-data,1,FILEIN);
      for (int i=data; i<taille; i++)
        bmp[i]=in[i-data];		
      image1 = new BMP(longueur, largeur, in);
      imapt1 = new BMP(longueur, largeur, in);
      image2 = new BMP(longueur, largeur,in);
      imapt2 = new BMP(longueur, largeur,in);
      fclose(FILEIN);	       
     
      fseek(FILEIN2,data,SEEK_SET);
      fread(in,taille-data,1,FILEIN2);
      image2->setData(in);
      imapt2->setData(in);
      fclose(FILEIN2);	
     
      FILEOUT=fopen("out.bmp","wb");
      imapt2->getData(in);
      for (int j=data; j<taille; j++)
        bmp[j]=in[j-data];
      fseek(FILEOUT,0,SEEK_SET);    
      fwrite(&bmp,taille,1,FILEOUT);
      fclose(FILEOUT);
     
      return 0;
    }
    alors que celui-ci fait ce qu'on lui demande
    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
     
    #include "image.h"
    #include "utils.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
      FILE * FILEIN;
      FILE * FILEIN2;
      FILE * FILEOUT;
      unsigned char mot[4];
      unsigned long longueur, largeur, taille, debut;
      int med = atoi(argv[3]);
     
      FILEIN = fopen(argv[1],"rb"); 
      FILEIN2 = fopen(argv[2],"rb");
     
      fread(mot,2,1,FILEIN); 
      fread(mot,4,1,FILEIN); 
      taille=convWrd(mot);
      fseek(FILEIN,10L,SEEK_SET);
      fread(mot,4,1,FILEIN); 
      debut=convWrd(mot);
      fseek(FILEIN,18L,SEEK_SET);
      fread(mot,4,1,FILEIN); 
      longueur=convWrd(mot);
      fread(mot,4,1,FILEIN);
      largeur=convWrd(mot);
     
      fseek(FILEIN,0,SEEK_SET);
      unsigned char entete[debut];
      fread(entete,debut,1,FILEIN);  
     
      fseek(FILEIN,debut,SEEK_SET);
      unsigned char in[taille-debut];
      fread(in,taille-debut,1,FILEIN);
      BMP image(longueur,largeur,in);
      fclose(FILEIN);
     
      fseek(FILEIN2,debut,SEEK_SET);
      fread(in,taille-debut,1,FILEIN2);
      BMP image2(longueur,largeur,in);
      fclose(FILEIN2);
     
      BMP imamed(image);
      imamed = image - image2;
      imamed.binarize(med);
     
      imamed.getData(in);
     
      FILEOUT=fopen("out.bmp","wb");
      fseek(FILEOUT,0,SEEK_SET);
      fwrite(&entete,debut,1,FILEOUT);
     
      fwrite(&in,taille-debut,1,FILEOUT);
      fclose(FILEOUT);
     
      return 0;
    }
    [/code]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Bon, ce sont des infos précieuses déjà.
    Tu peux quand même tester ce que je disais dans mon premier post :
    Tu peux aussi essayer de lire une image simple qui ferait 100x100 pixels qui serait composée d'une ligne rouge, une ligne bleue, une rouge, une bleue, etc... Ainsi, tu pourrais mieux détecter si il y a effectivement un décalage ou si c'est un autre problème.
    Mais le plus efficace reste le débuguage pas à pas en vérifiant que tu as bien les valeurs attendues à la lecture.
    Ensuite, si la lecture est ok, c'est que le problème vient de ta classe image.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    jolyloic les deux images font la meme taille
    le seul cas ou j'obtiens une image non brouille est le cas ou les deux image en entree dont identiques (meme contenu nom different ou meme nom)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Y a quand même un truc qui me chagrine sérieusement : tu répètes plusieurs fois du code pour la lecture ou l'écriture d'un fichier image qui pourrait (donc devrait) être factorisé dans des fonctions.
    Ca rendrait le code plus lisible et ça serait plus sûr.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    c tout a fait exact
    g essayer de le factorise et de l'ecrire dans un fonctionde chargement d'une image :
    resultat identique

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Ben là, hormis se retrousser les manches et regarder pas-à-pas ce qui se passe, je vois pas.
    J'ai jeté un oeil rapide sur ton code, l'ennui est que tu n'as pas mis de commentaires, je ne sais pas ce que ton code doit faire.
    Bon courage.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    juste avant de spartir pour l'asile je suis arrive a ca avec les MEMES resultats !!!
    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
     
    #include "utils.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
     FILE * FILEIN;
     FILE * FILEIN2;
     FILE * FILEOUT;
     unsigned char mot[4];
     int longueur, largeur, taille, data;  
     
      //ouverture des fichiers image
      FILEIN = fopen(argv[1],"rb");
      FILEIN2 = fopen(argv[2],"rb");
     
     //recupeartion des parametres de l'image
      fread(mot,2,1,FILEIN); //BM  
      fread(mot,4,1,FILEIN); //taille de l image
      taille=(int)convWrd(mot);
      fseek(FILEIN,10L,SEEK_SET);
      fread(mot,4,1,FILEIN); //longueur de l image
      data=(int)convWrd(mot);
      fseek(FILEIN,18L,SEEK_SET);
      fread(mot,4,1,FILEIN); //hauteur de l image
      longueur=(int)convWrd(mot);
      fread(mot,4,1,FILEIN);
      largeur=(int)convWrd(mot);    
     
      //on se place au-debut de l'image pour recuperer l'en-tete
      fseek(FILEIN,0,SEEK_SET);
      unsigned char entete[data];
      fread(entete,data,1,FILEIN);
     
      //on recupere le corps 
      fseek(FILEIN,data,SEEK_SET);
      unsigned char bmp1[taille-data];
      fread(bmp1,taille-data,1,FILEIN);
      fclose(FILEIN);	       
     
    // Partie a probleme
    /**********************************************************/
      //idem deuxieme fichier
      fseek(FILEIN2,data,SEEK_SET);
      unsigned char bmp2[taille-data];
      fread(bmp2,taille-data,1,FILEIN2);  
      fclose(FILEIN2);	 
    /*********************************************************/
     
      //ouverture d'un fichier en sortie pour tester le second fichier
      FILEOUT=fopen("out.bmp","wb");
      fseek(FILEOUT,0,SEEK_SET);   
      fwrite(entete,data,1,FILEOUT);
      fwrite(bmp2,taille-data,1,FILEOUT);
      fclose(FILEOUT);   
     
      return 0;
    }

  12. #12
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    bonjour,

    tu n'as pas remarqué que tes balises code ne font rien
    utilise le bouton "Code" tout bonnement, et édite tes anciens messages (en cliquant sur "éditer") pour rectifier les autres balises. c'est illisible et très désagréable pour ceux qui veulent t'aider.

    merci

    balise de fin [/code]
    balise de début [code]

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Plutôt que de nous bombarder avec ton code sauvagement, tu pourrais nous mettre quelques commentaires pour expliquer ce que doivent faire les différents blocs qui le composent ?
    Parce que comme je te l'ai dit plus haut, j'ai essayé de comprendre mais je ne suis pas devin.

    Si tu ne fais pas un minimum d'efforts pour nous faciliter la tâche, ne t'attends pas à avoir de l'aide vraiment utile.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    Ton problème est la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(FILEIN2,data,SEEK_SET);
    parce que data contient la position des données du PREMIER bmp...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fread(mot,4,1,FILEIN); //longueur de l image
      data=(int)convWrd(mot);
    ce qui en fait n'est pas automatiquement le cas pour tout les bmps... donc déjà voit ça, essayer plutot de récuperer la position du deuxieme bmp

    sinon c'est la raison pour laquelle ça fonctionne avec le meme bmp ^^

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 8
    Par défaut
    merci c'estait bien un probleme de positionnement dans le second fichier,
    mais aussi parce qu'ils n'etaient aps formate de lameme maniere.
    Mon code est maintenant pleinement fonctionnel avec une verification du formatage des fichiers

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/10/2006, 18h27
  2. [C#2.0]DatagridView + Chargement fichier XML
    Par chnew dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/04/2006, 12h35
  3. [FLASH] Pb de caractères quand chargement fichier .txt
    Par origami-graphics dans le forum Flash
    Réponses: 1
    Dernier message: 12/02/2006, 14h53
  4. Chargement fichier volumineux
    Par kirsoul dans le forum Installation
    Réponses: 2
    Dernier message: 26/07/2005, 14h53
  5. [Plugin][Jar] Chargement fichier de conf d'un jar
    Par vberetti dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 29/06/2005, 14h03

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