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 :

creation et manipulation d'images


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Par défaut creation et manipulation d'images
    Bonjour tout le monde,

    j'ai ecrit des fonctions sur la manipulation d'image (.pgm)que je dois tester et je ne sais pas comment faire.
    1-Je doit charger une photo et l'afficher,
    2-en faire une copie
    3-sauvegarder la copie dans un fichier texte.

    Structure image_t:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct
    	{
    	unsigned long nx;
    	unsigned long ny;
    	unsigned long nb_ng;
    	unsigned char *buff;
    	} image_t;
    fonction de creation de l'image et de copie de l'image.
    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
    image_t *creer_image(){
    	image_t * img1;
     
    	img1 = (image_t*)malloc(sizeof(image_t));
    	img1->nx=0;
    	img1->ny=0;
    	img1->nb_ng=0;
    	img1->buff=NULL;
     
    	return img1;
     }
    image_t *copier_image(image_t *src){
    	image_t *dest;	
    	dest=creer_image();
    	dest->nx=src->nx;
    	dest->ny=src->ny;
    	dest->nb_ng=src->nb_ng;
    	dest->buff=(unsigned char*)malloc(src->nx*src->ny*sizeof(unsigned char));
    	memcpy(dest->buff,src->buff,src->nx*src->ny*sizeof(unsigned char));
     
    	return dest;
    }
    fonction pour sauvegarder l'image dans un fichier texte.
    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
    int sauver_image_pgm(char *nom_fichier, image_t *img){
     
    	FILE *fic;
     
    	fic=fopen(nom_fichier,"w");
    	if(fic==NULL){
    	    fprintf(stderr,"impossible d'ouvrir le fichier");
    	    return 0;
    	}
    	fprintf(fic,"P5\n");
    	fprintf(fic,"%d %d\n",img->nx,img->ny);
    	fprintf(fic,"%d\n",img->nb_ng);
     
    	fwrite(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
    	fclose(fic);
     
    	return 1;
    }
    Donc mon probleme est que je ne sais pas ce que je dois mettre dans la fonction main pour tester toute ces fonctions.


    Merci

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

    Une première approche est d'appeler les fonctions les unes après les autres en vérifiant que tout fonctionne :

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    /* ton header */
    #include "image.h"
    int main(void)
    {
        int err;
        image_t *image;
     
        /* TEST creer_image */
        printf("1- creer_image ");
        image = creer_image();
        if (NULL == image) {
            printf("BAD\n");
            exit(EXIT_FAILURE);
        } else {
            printf("OK\n");
        }
     
        /* Remplissage de l'image créée */
        image->nx = 128;
        image->ny = 128;
        image->nb_ng = 256;
     
        image->buff = calloc(image->nx * image->ny, sizeof *image->buff);
     
        if (NULL == image->buff) {
            perror("calloc");
            exit(EXIT_FAILURE);
        }
     
        {
            size_t i, j, k;
            for (k = i = 0; i < image->nx; ++i) {
                for (j = 0; j < image->ny; ++j, ++k) {
                    image->buff[k] = i + j;
                }
            }
        }
     
        /* TEST sauver_image_pgm */
        printf("2- sauver_image_pgm ");
     
        err = sauver_image_pgm("test.pgm", image);
     
        if (0 == err) {
            printf("BAD\n");
        } else {
            printf("OK\n");
        }
     
        /* Et ainsi de suite ... */
     
        return EXIT_SUCCESS;
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Par défaut
    Bonjour,

    Merci Mabu j'ai pu tester mes fonctions grace a tes indications.
    J'ai écrit une fonction qui doit lire un fichier (.pgm) et allouer une nouvelle image a partir de la lecture de ce fichier.
    A l'execution j'ai une "erreur de segmentation".
    J'ai du mal avec les fonctions de lecture de fichier.

    voici le code de ma fonction, quelques conseils seraient bienvenue.

    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
    image_t *charger_image_pgm(char *nom_fichier){
     
    	FILE *fic;
    	image_t *img;
    	char buff[TAILLE_BUFF];
    	int i;
    	fic=fopen(nom_fichier,"r");
    	if(fic==NULL){
    	    fprintf(stderr,"impossible d'ouvrir le fichier");
    	    return 0;
    	}
    	fgets(buff,TAILLE_BUFF,fic);
     
    	fread(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
     
    	fclose(fic);
    	return img;
    }
    Merci

  4. #4
    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
    image_t *charger_image_pgm(char *nom_fichier){
    	FILE *fic;
    	image_t *img;
    ....
    	fread(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
    ....
    Tu as créé un pointeur non initialisé img. Il pointe dans les décors et dès que tu veux l'utiliser, cela plante.
    Créer un pointeur ne crée PAS l'objet pointé. Il faut que tu crées un image_t convenable et mettre son adresse dans img.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Par défaut
    merci Diogene j'ai corrigé mon erreur grace a tes conseils.

    Maintenant j'essaie de charger une photo, d'en faire une copie et de sauvegarder cette copie, le probleme c'est que les fichiers ne sont pas identiques la copie est une image toute blanche. voici mes codes:

    pour copier l'image:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    image_t *copier_image(image_t *src){
    	image_t *dest;	
            dest=creer_image();
     
    	dest->nx=src->nx;
    	dest->ny=src->ny;
    	dest->nb_ng=src->nb_ng;
     
    	dest->buff=(unsigned char*)malloc(src->nx*src->ny*sizeof(unsigned char));
     
    	memcpy(dest->buff,src->buff,src->nx*src->ny*sizeof(unsigned char));
     
    	return dest;
    }
    Pour sauver l'image dans un fichier:

    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
    int sauver_image_pgm(char *nom_fichier, image_t *img){
     
    	FILE *fic;
     
    	fic=fopen(nom_fichier,"w");
    	if(fic==NULL){
    	    fprintf(stderr,"impossible d'ouvrir le fichier");
    	    return 0;
    	}
     
            fwrite(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
    	fclose(fic);
     
    	return 1;
    }
    Pour lire l'image a partir du fichier fourni en argument:

    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
    image_t *charger_image_pgm(char *nom_fichier){
     
    	FILE *fic;
    	image_t *img;
    	char buff[TAILLE_BUFF];
     
    	fic=fopen(nom_fichier,"r");
    	if(fic==NULL){
    	    fprintf(stderr,"impossible d'ouvrir le fichier");
    	    return 0;
    	}
     
    	img=creer_image();
     
    	fgets(buff,TAILLE_BUFF,fic);
     
    	fread(img->buff,img->nx,img->ny*sizeof(unsigned char),fic);
     
    	fclose(fic);
    	return img;
    }
    La fonction de test main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    	{
           image_t *charge_img;	
           image_t *copy1;
           int copy2;
     
           charge_img=charger_image_pgm("quest.pgm");
           copy1=copier_image(charge_img);
     
           copy2=sauver_image_pgm("quest2.pgm",copy1);
     
            return EXIT_SUCCESS;
     
    }
    A la fin de l'execution j'ai mon image quest.pgm qui est normale et quest2.pgm qui est toute blanche. Est ce que c'est normale? Comment avoir des copies identiques?

    Merci

  6. #6
    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
    Il y a une différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    image_t *charger_image_pgm(char *nom_fichier){
     
    	FILE *fic;
    	image_t *img;
    	char buff[TAILLE_BUFF];
    ....
     
    	fgets(buff,TAILLE_BUFF,fic);
    Tu lis une ligne (fgets) que tu ne vas pas recopier puisqu'elle est tout simplement ignorée (le contenu de buff n'est pas utilisé)
    Je ne connais pas le format d'un tel fichier, mais il est étonnant qu'il commence par une ligne de TEXTE. Si c'est néammoins le cas, il faut bien, en recopie, mettre la ligne de texte adéquate.

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    comment faire, je fais cette verification dans la fonction ou dans le main?peut tu m'indiquer la syntaxe s'il te plait?est ce que c'est a cause de la vérification que je n'arrive pas a copier mon image?
    printf est la manière la plu simple de procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("largeur : %d\n", nx);
    printf("hauteur : %d\n", ny);
    printf("nombre de gris : %d\n", nb_ng);

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Par défaut
    Salut

    Avec printf à l'execution, j 'ai bien les valeurs lues dans le fichier, elle correspondent, mais ma copie est toujours une image blanche. Voici les modif de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            fscanf(fic,"P5\n");
    	fscanf(fic,"%d %d\n",&nx, &ny);
    	fscanf(fic,"%d\n",&nb_ng);
     
            printf("largeur :%d\n", nx);
    	printf("longueur :%d\n", ny);
    	printf("hauteur :%d\n", nb_ng);
    Je suis débutant en C, ca fait plusieur jour que je cherche la solution au probleme et je remercie tous ceux qui m'ont aidé mais je n'est pas l'impression de progresser. Est- ce que quelqu'un peu regarder mon code, me dire ce qui ne marche pas et me donner les conseils necessaire pour finir mon programme.
    Avec toute ma gratitude.

    Merci

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

Discussions similaires

  1. Manipulation d'images
    Par Tragnee dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 08/04/2006, 17h59
  2. [VBA-E]Manipuler des images
    Par nils.angot dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/02/2006, 10h59
  3. [SWING] Manipulation d'images
    Par TylerKnoxx dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 13/09/2005, 22h33
  4. [SDL] manipulation d'image
    Par zdra dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/02/2004, 16h56

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