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 :

Aide pour un programme qui manipule une image BMP


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Aide pour un programme qui manipule une image BMP
    Salut à toutes et à tous.
    Je suis entrin d'aprendre le C et la j'aborde la manipulation de differents fichiers et notament une image en BMP.
    Alors voila ce que je veus faire:
    -lire une image bmp en extrayant les elements descriptifs (tailles,largeur,etc..)
    -récupérer pour chaque pixels de l'image les composant des couleurs ( les niveaux du vert du bleu et du jaune) je essayé de faire ça grace à un tableau dynamique ( allocation memoire et tout c'est la que ça cloche je pense :s)
    -modifier les valeurs des composants de couleur (ça peut colcher ici aussi :s)

    peut être que j'en demande beaucoup désolé si c'est le cas.

    voila mon programe qui me fait la premiére étape c'est à dire la récuperation des élements déscriptifs mais il ne fait pas les autres étapes ( "erreur de segmentation ")

    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    typedef struct entete entete;
    struct entete
    {
      char format [3]; 
      int taille;
      int reserve;
      int BMP_Off;
      int BMP_Width;
      int BMP_Height;
    };
     
     
    typedef struct sCoul sCoul;
    struct sCoul
    {
      unsigned char R;
      unsigned char V;
      unsigned char B;
    };
     
     
    entete RecupEntete(FILE *fpin)
    {
      entete E1;
      fread(&E1.format,2,1,fpin);
      fread(&E1.taille,4,1,fpin);
     
      fread(&E1.reserve,4,1,fpin);
     
      fread(&E1.BMP_Off,4,1,fpin);
     
      fread(&E1.reserve,4,1,fpin);
     
      fread(&E1.BMP_Width,4,1,fpin);
     
      fread(&E1.BMP_Height,4,1,fpin);
      return E1;  
    }
     
    entete RecupEntete(FILE *fpin);
     
     
     
    int main(void)
    {
      char nomFichier[]="";
      int i=0;
      int j=0;
      int k=0; 
      int x=0; 
      int y=0; 
      FILE*  f;
      FILE*  newFile;
      entete E;
      /*tabeau de couleurs ( R,V,B )*/
     
      sCoul *couleurs=NULL;
      sCoul *newColors=NULL;
      printf("Entrez le nom de l'image:  ");
      scanf("%s",nomFichier);
      strcat(nomFichier,".bmp");
     
            printf("%s\n",nomFichier);
     
    	f = fopen(nomFichier,"rb");
    	if (f==NULL)
    	  {
    	    printf("Erreur de chargement de l'image");
    	    return(0);
    	  }
      else
        {
          E=RecupEntete(f);
            printf("format: %d\n",E.reserve);
            printf("Taille du fichier: %d\n",E.taille); 
    	printf("OFFSET: %d\n",E.BMP_Off);
    	printf("Largeur du fichier: %d\n",E.BMP_Width);
            printf("Hauteur du fichier: %d\n",E.BMP_Height);     
     
     
            fseek(f, E.BMP_Off, SEEK_SET); /* positionnement du curseur
    					sur le debut du corps*/
            i=0;
     
          /* allocation dynamique du tableau contenant les couleurs*/
     
          couleurs=malloc (E.taille*sizeof(sCoul));
          while (!feof(f))
    	  {
                /* on remplis le tableau avec les valeurs de couleur des pixels*/
                fread(&couleurs[i], sizeof(sCoul),1,f);
     
                /*si le pixel est noir je le print*/
    /* 	    if (couleurs[i].B+couleurs[i].V+couleurs[i].R==0) */
    /* 	      { */
    /* 		x=(i % E.BMP_Width); */
    /* 		y=(i % E.BMP_Height); */
    /* 		printf("PIXEL NOIR ! Coordonnée en (x:%d,y:%d)\n",x,y); */
    /* 		j++; */
    /* 	      } */
     	    i++; 
               }  
           j=0;
          while (j<i)
    	{
    	  newColors[j].R=255-couleurs[j].R ;
    	  newColors[j].V=255-couleurs[j].V;
    	  newColors[j].B-=255-couleurs[j].B;
                    j++;
    	}
     
          // je crée mon nouveau fichier
          newFile = fopen("Resu.bmp", "wb");
          if (newFile == NULL)
                printf ("Erreur ...");
          else
    	{
    	  fwrite(&E, sizeof(entete),1,newFile);
    	  j=0;
                 while(j<i)
    	       {
    		 fwrite(&newColors[j], (sizeof(sCoul)),1,newFile);
    		 j++;
    	       }  
               }
          fclose(newFile);   /* ajoute EOF au fichier et ferme le fichier */
     
     
        printf("appuyez sur une touche");
            getchar();
            getchar();
            return EXIT_SUCCESS;
        }
    }
    merci d'avance pour toutes les réponses et désolé pour mon ortographe catastrophique.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
      char nomFichier[]="";
    ....
      scanf("%s",nomFichier);
      strcat(nomFichier,".bmp");
    nomFichier est inapte à stocker le nom du fichier, puisque ce tableau n'a qu'un caractère. L'écriture dans ce tableau va déborder et écraser ce qui est situé derrière. Le programme pourrait planter dès le scanf et c'est une malchance qu'il ne le fasse pas.
    Déclarer plutôt
    char nomFichier[256];
    ou toute dimension suffisante pour stocker le résultat du scanf + ".bmp"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          i=0;
          couleurs=malloc (E.taille*sizeof(sCoul));
          while (!feof(f))
    	  {
                /* on remplis le tableau avec les valeurs de couleur des pixels*/
                fread(&couleurs[i], sizeof(sCoul),1,f);
    ...
     	    i++; 
               }
    L'arrêt de la boucle devrait être gouverné par la valeur de i, pas par la détection d'une fin de fichier:
    while (i<E.taille)....

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Tout d'abord merci pour votre réponse trés rapide, effectivement j'ai eu de la chance que ça ne plante pas au scanf.
    J'ai effectué les changements dans le while mais enfaite ça change rien car je ne pense pas que ça plante ici vu que j'ai mis le test des pixel noir et les programme m'affiche les coordonnées de ces pixels mais quand il essai de faire le changement des couleurs c'est la que ca me fait "erreur de segmentation (core dumped)"
    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
           j=0;
          while (j<i)
    	{
    	  newColors[j].R=255-couleurs[j].R ;
    	  newColors[j].V=255-couleurs[j].V;
    	  newColors[j].B-=255-couleurs[j].B;
                    j++;
    	}
     
          // je crée mon nouveau fichier
          newFile = fopen("Resu.bmp", "wb");
          if (newFile == NULL)
                printf ("Erreur ...");
          else
    	{
    	  fwrite(&E, sizeof(entete),1,newFile);
    	  j=0;
                 while(j<i)
    	       {
    		 fwrite(&newColors[j], (sizeof(sCoul)),1,newFile);
    		 j++;
    	       }  
               }
          fclose(newFile);   /* ajoute EOF au fichier et ferme le fichier */
     
     
        printf("appuyez sur une touche");
            getchar();
            getchar();
            return EXIT_SUCCESS;
        }
    }
    voila c'est à partir de la que ça cloche je pense

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    euh...

    tu incrementes j pour fabriquer, et apres tu te sers de i comme limite et re-demarre avec j = 0...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    comme je l'ai dit j'aprend donc je fait plein de faute si tu pouvais m'aider ça serai trés bien. merci

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 961
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 961
    Par défaut
    Fio,
    Citation Envoyé par densha Voir le message
    Tout d'abord merci pour votre réponse trés rapide, effectivement j'ai eu de la chance que ça ne plante pas au scanf.
    Non, tu as eu la malchance que ça ne plante pas, car tu as ainsi obtenu un programme au comportement indéterminé, alors que tu pouvais le penser bon.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	  newColors[j].B-=255-couleurs[j].B;
    ton moins, la, c'est bien ce que tu veux ??

    si B vaut 0, 255-B vaut 255, -= donne -255 => crash

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	  newColors[j].B-=255-couleurs[j].B;
    ton moins, la, c'est bien ce que tu veux ??

    si B vaut 0, 255-B vaut 255, -= donne -255 => crash
    newColors[j].B est unsigned char et le comportement est bien défini (même si ce n'est peut-être pas celui attendu par le codeur compte tenu que newColors[j].B n'est pas initialisé) et ne peut entrainer de crash.
    Par contre, newColors est déclaré comme un pointeur et je n'ai pas vu d'allocation le concernant (alors qu'elle existe pour couleurs) .
    newColors[j] n'existe pas. Alors, là, c'est le crash!

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/05/2013, 13h28
  2. Aide pour un script qui calcule le temps passé depuis une date
    Par Mooneer dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/05/2008, 15h23
  3. programme pour réduire la résolution d'une image
    Par khokho dans le forum Multimédia
    Réponses: 6
    Dernier message: 16/11/2006, 19h44
  4. Réponses: 2
    Dernier message: 05/07/2006, 15h21
  5. Programme qui créer des images d'après une vidéo
    Par snoopy69 dans le forum Vidéo
    Réponses: 7
    Dernier message: 03/04/2006, 08h33

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