Dessin dans Drawing Area gtk+ sous linux

Dessin dans Drawing Area gtk+ sous linux - C - Programmation

Marsh Posté le 05-12-2010 à 08:55:31    

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 :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gtk/gtk.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include "lib_image.h"
  7. #define NB_MAX_LIG 600
  8. #define NB_MAX_COL 600
  9. /*
  10.   Fonction de lecture d'une image au format ppm.
  11.   Attention, cette fonction ne gere pas les lignes de commentaire
  12.   qui pourraient se trouver dans le fichier image (ligne commencant par #)
  13.   Parametre:
  14.   - uneImage: pointeur sur une struture de type Timage qui doit deja etre allouee
  15.   - filename: nom du fichier contenant les données de l'image
  16. */
  17. int Eval(char Chaine[20])
  18. {
  19.     int i,valeur=0;
  20.     for (i=0;i<strlen(Chaine);i++)
  21.     {
  22.         valeur+=(Chaine[i]-48)*pow(10,strlen(Chaine)-i-1);
  23.     }
  24.     return valeur;
  25. }
  26. int Taille_fichier (const char *filename)
  27. {
  28.     char ligne[20];
  29.     int i=0;
  30.     FILE *image;
  31.     image=fopen(filename, "rt" );
  32.     while (fgets( ligne, 20, image ) != NULL)
  33.     {
  34.         i++;
  35.     }
  36.     fclose(image);
  37.     return i;
  38. }
  39. void Lire_Image_PPM (Timage *monImage, const char *filename)
  40. {
  41.     FILE *image;
  42.     char ligne[20],col[20],lig[20];
  43.     int i=0,j=0;
  44.     image=fopen(filename, "rt" );
  45.     fgets(ligne, 20, image);
  46.     fgets(ligne, 20, image);
  47.     while (ligne[i]!=' ')
  48.     {
  49.         lig[i]=ligne[i];
  50.         i++;
  51.     }
  52.     lig[i]='\0';
  53.     i++;
  54.     j=i;
  55.     while (ligne[i]!='\n')
  56.     {
  57.         col[i-j]=ligne[i];
  58.         i++;
  59.     }
  60.     col[i-j]='\0';
  61.     fclose(image);
  62.     (*monImage).nb_col=Eval(col);
  63.     (*monImage).nb_lig=Eval(lig);
  64.     for (i=0;i<(*monImage).nb_lig;i++)
  65.     {
  66.         for (j=0;j<(*monImage).nb_col;j++)
  67.         {
  68.             fgets(ligne, 20, image);
  69.             (*monImage).pixels[j][i].r=Eval(ligne);
  70.             fgets(ligne, 20, image);
  71.             (*monImage).pixels[j][i].v=Eval(ligne);
  72.             fgets(ligne, 20, image);
  73.             (*monImage).pixels[j][i].b=Eval(ligne);
  74.         }
  75.     }
  76. }
  77. void decouper_image(Timage * ima1, Timage * ima2, int c1, int l1, int c2, int l2)
  78. {
  79.     /*
  80.     ...
  81.     a remplir
  82.     ...
  83.     */
  84. }
  85. void Affiche_Image (Timage monImage,char name[20], int argc, char *argv[])
  86. {
  87.     int i,j;
  88.     GtkWidget *image;
  89.     GtkWidget *window;
  90.     GdkGC *gc;
  91.     GdkColor fg;
  92.     GdkRectangle update;
  93.     gtk_init(&argc, &argv);
  94.     //-------------------------Création fenetre---------------------------------------------
  95.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  96.     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  97.     gtk_window_set_default_size(GTK_WINDOW(window),monImage.nb_lig, monImage.nb_col);
  98.     gtk_window_set_title(GTK_WINDOW(window), name);
  99.     gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  100.     gtk_container_set_border_width(GTK_CONTAINER(window), 2);
  101.     //------------------------Creation Drawing Area-----------------------------------------
  102.     image = gtk_drawing_area_new();
  103.     gtk_widget_set_usize(image, monImage.nb_lig, monImage.nb_col);
  104.     update.x=0;
  105.     update.y=0;
  106.     update.width=monImage.nb_lig;
  107.     update.height=monImage.nb_col;
  108.     gtk_container_add(GTK_CONTAINER(window), image);
  109.     g_signal_connect_swapped(G_OBJECT(window), "destroy",
  110.                              G_CALLBACK(gtk_main_quit), G_OBJECT(window));
  111.     //---------------------------Remplissage Drawing Area avex pixels--------------------
  112.     for (i=0;i<monImage.nb_lig;i++)
  113.     {
  114.         for (j=0;j<monImage.nb_col;j++)
  115.         {
  116.             //Définition couleur
  117.             fg.red = monImage.pixels[j][i].r*255;
  118.             fg.green = monImage.pixels[j][i].v*255;
  119.             fg.blue = monImage.pixels[j][i].b*255;
  120.             gc = gdk_gc_new(GDK_DRAWABLE (image));
  121.             gdk_gc_set_foreground(gc, &fg);
  122.             //Dessin pixel
  123.             gdk_draw_point(&image,gc, j, i);
  124.         }
  125.     }
  126.     gtk_widget_draw (image,&update);
  127.     gtk_widget_show_all(window);
  128.     gtk_main();
  129. }
  130. int main (int argc, char *argv[])
  131. {
  132.     Timage monImage;
  133.     Lire_Image_PPM (&monImage, "DentDuGeant.ppm" );
  134.     Affiche_Image(monImage, "Dent Du Geant",&argc, &argv);
  135. }


 
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
Reply

Marsh Posté le 05-12-2010 à 08:55:31   

Reply

Marsh Posté le 05-12-2010 à 09:42:37    

Tu peux essayer de trouver avec Debug.
 
Je n'y pense jamais pour ma par. :/

Reply

Marsh Posté le 05-12-2010 à 11:52:32    

Bonjour,
D'après google, il y a plusieurs type d'erreur glibc "detected", de laquelle s'agit il?
Sinon pour tes couleurs pourquoi tu les multiplie toutes par 255?


---------------
Seul Google le sait...
Reply

Marsh Posté le 05-12-2010 à 13:39:17    

Merci pour les réponses.
 
Pour les couleurs, il me semble que gtk travail entre 0 et 65535. Mon image est codée sur 8 bits par couleurs.
 
Pour le reste, voici le message d'erreur généré par la console:
*** glibc detected *** /home/alaur/Documents/Programme C/TP5/Traitement image/bin/Debug/Traitement image: malloc(): memory corruption: 0xb771f008
 
Je précise que je travail avec Code::blocks.
 
PS: le code se compile et s'exécute. L'erreur survient donc à l'exécution.


Message édité par amaury10 le 05-12-2010 à 13:40:03

---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
Reply

Marsh Posté le 05-12-2010 à 13:52:32    

tu crées un graphic context pour chaque pixel de ton image  [:cerveau skyzor]

Reply

Marsh Posté le 05-12-2010 à 14:32:30    

GrosBocdel a écrit :

tu crées un graphic context pour chaque pixel de ton image  [:cerveau skyzor]


 
Tu pourrais préciser un peu ton propos STP? C'est ma première interface graphique avec gtk...
J'ai pas encore appréhendé tous les concepts de gtk.


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
Reply

Marsh Posté le 05-12-2010 à 14:34:48    

amaury10 a écrit :


 
Tu pourrais préciser un peu ton propos STP? C'est ma première interface graphique avec gtk...
J'ai pas encore appréhendé tous les concepts de gtk.


 
sors
gc = gdk_gc_new(GDK_DRAWABLE (image));
de tes boucles. C'est à faire une seule fois.

Reply

Marsh Posté le 06-12-2010 à 07:42:45    

GrosBocdel a écrit :


sors
gc = gdk_gc_new(GDK_DRAWABLE (image));
de tes boucles. C'est à faire une seule fois.


 
Salut,
 
C'est fait, mais le problème persiste...


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
Reply

Marsh Posté le 06-12-2010 à 10:17:23    

amaury10 a écrit :


 
Salut,
 
C'est fait, mais le problème persiste...


 
Si tu l'as bien mis avant tes deux boucles, je ne vois rien de plus que je puisse faire sans compiler le truc complet!
 
Eventuellement place des printf("toto\n" ); un peu partout, ça peut t'aider à savoir quelle ligne provoque le truc, même si avec les ihm ça marche pas toujours.
 
edit je dis une bétise: il me semble que les fonctions du style gtk_main() doivent se trouver dans ton main()
 


Message édité par GrosBocdel le 06-12-2010 à 10:22:01
Reply

Marsh Posté le 06-12-2010 à 18:38:06    

Merci d'essayer de m'aider. J'ai déplacer le gtk_main() dans le main. Sa ne marche toujours pas.
 
Je vais donc écrire un petit programme en python qui affiche l'image avec TKinter...


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
Reply

Marsh Posté le 06-12-2010 à 18:38:06   

Reply

Marsh Posté le 06-12-2010 à 19:08:24    

Ça sent le buffer overflow ton problème, plus que certainement dû à ta fonction de lecture d'image.  
 
Pourrait-on avoir la définition du type Timage (voire tout le fichier lib_image.h si ce n'est pas trop long) ?

Reply

Marsh Posté le 06-12-2010 à 19:12:14    

tpierron a écrit :

Ça sent le buffer overflow ton problème, plus que certainement dû à ta fonction de lecture d'image.  
 
Pourrait-on avoir la définition du type Timage (voire tout le fichier lib_image.h si ce n'est pas trop long) ?


 
Il y a ça aussi qui est louche:
gdk_draw_point(&image,gc, j, i);
image est déjà un pointeur.
 
Je passe mon tour  [:cosmoschtroumpf] sinon on va corriger les corrections de corrections pendant des heures

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed