amaury10 | Bonjour à tous,
Dans l'optique d'afficher une image au format ppm, je doit remplir une drawing area pixels par pixels.
J'ai donc écrit un morceau de code qui lit l'image et la stocke dans une variable.
Le problème survient à l'affichage: J'ai une erreur *** glibc detected ***
Voici le programme incriminé:
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <gtk/gtk.h>
- #include <string.h>
- #include <math.h>
- #include "lib_image.h"
- #define NB_MAX_LIG 600
- #define NB_MAX_COL 600
- /*
- Fonction de lecture d'une image au format ppm.
- Attention, cette fonction ne gere pas les lignes de commentaire
- qui pourraient se trouver dans le fichier image (ligne commencant par #)
-
- Parametre:
- - uneImage: pointeur sur une struture de type Timage qui doit deja etre allouee
- - filename: nom du fichier contenant les données de l'image
- */
- int Eval(char Chaine[20])
- {
- int i,valeur=0;
- for (i=0;i<strlen(Chaine);i++)
- {
- valeur+=(Chaine[i]-48)*pow(10,strlen(Chaine)-i-1);
- }
- return valeur;
- }
- int Taille_fichier (const char *filename)
- {
- char ligne[20];
- int i=0;
- FILE *image;
- image=fopen(filename, "rt" );
- while (fgets( ligne, 20, image ) != NULL)
- {
- i++;
- }
- fclose(image);
- return i;
- }
- void Lire_Image_PPM (Timage *monImage, const char *filename)
- {
- FILE *image;
- char ligne[20],col[20],lig[20];
- int i=0,j=0;
- image=fopen(filename, "rt" );
- fgets(ligne, 20, image);
- fgets(ligne, 20, image);
- while (ligne[i]!=' ')
- {
- lig[i]=ligne[i];
- i++;
- }
- lig[i]='\0';
- i++;
- j=i;
- while (ligne[i]!='\n')
- {
- col[i-j]=ligne[i];
- i++;
- }
- col[i-j]='\0';
- fclose(image);
- (*monImage).nb_col=Eval(col);
- (*monImage).nb_lig=Eval(lig);
- for (i=0;i<(*monImage).nb_lig;i++)
- {
- for (j=0;j<(*monImage).nb_col;j++)
- {
- fgets(ligne, 20, image);
- (*monImage).pixels[j][i].r=Eval(ligne);
- fgets(ligne, 20, image);
- (*monImage).pixels[j][i].v=Eval(ligne);
- fgets(ligne, 20, image);
- (*monImage).pixels[j][i].b=Eval(ligne);
- }
- }
- }
- void decouper_image(Timage * ima1, Timage * ima2, int c1, int l1, int c2, int l2)
- {
- /*
- ...
- a remplir
- ...
- */
- }
- void Affiche_Image (Timage monImage,char name[20], int argc, char *argv[])
- {
- int i,j;
- GtkWidget *image;
- GtkWidget *window;
- GdkGC *gc;
- GdkColor fg;
- GdkRectangle update;
- gtk_init(&argc, &argv);
- //-------------------------Création fenetre---------------------------------------------
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_window_set_default_size(GTK_WINDOW(window),monImage.nb_lig, monImage.nb_col);
- gtk_window_set_title(GTK_WINDOW(window), name);
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
- gtk_container_set_border_width(GTK_CONTAINER(window), 2);
- //------------------------Creation Drawing Area-----------------------------------------
- image = gtk_drawing_area_new();
- gtk_widget_set_usize(image, monImage.nb_lig, monImage.nb_col);
- update.x=0;
- update.y=0;
- update.width=monImage.nb_lig;
- update.height=monImage.nb_col;
- gtk_container_add(GTK_CONTAINER(window), image);
- g_signal_connect_swapped(G_OBJECT(window), "destroy",
- G_CALLBACK(gtk_main_quit), G_OBJECT(window));
- //---------------------------Remplissage Drawing Area avex pixels--------------------
- for (i=0;i<monImage.nb_lig;i++)
- {
- for (j=0;j<monImage.nb_col;j++)
- {
- //Définition couleur
- fg.red = monImage.pixels[j][i].r*255;
- fg.green = monImage.pixels[j][i].v*255;
- fg.blue = monImage.pixels[j][i].b*255;
- gc = gdk_gc_new(GDK_DRAWABLE (image));
- gdk_gc_set_foreground(gc, &fg);
- //Dessin pixel
- gdk_draw_point(&image,gc, j, i);
- }
- }
- gtk_widget_draw (image,&update);
- gtk_widget_show_all(window);
- gtk_main();
- }
- int main (int argc, char *argv[])
- {
- Timage monImage;
- Lire_Image_PPM (&monImage, "DentDuGeant.ppm" );
- Affiche_Image(monImage, "Dent Du Geant",&argc, &argv);
- }
|
A priori, seule la fonction Affiche_Image génère une erreur...
Si quelqu'un peut m'aider à résoudre se problème, merci d'avance. ---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
|