FORSV : Forum de Sciences et de Vie

Forum scientifique
 
AccueilAccueil  GalerieGalerie  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  

Partagez | 
 

 Manipulation d'images avec gtk

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Manipulation d'images avec gtk   Sam 20 Oct 2007 - 21:34

Je cherche le moyen de faire des manipulations d'images avec gtk, comme réduire une dimension, faire des copies d'une portion d'image vers une autre, etc.

Je trouve des fonctions de dessin, des fonctions de copie d'image à image ou depuis un fichier, mais pas de redimensionnement ou de manipulation au sein de la même image.

Et ce ne sont pas les "images" qui manquent (gtkimage, gtkpixmap, gtkbitmap, gtkpixbuf, etc.

Les sources sur le net sont limitées, comme d'hab.

Comment faire ?

PeM
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Dim 21 Oct 2007 - 19:56

C'est vraiment n'importe quoi ! Il n'y a pas un seul tuto correct, les fonctions sont démultipliées pour faire la même chose et les fonctions de base n'existe pas ou ne sont même pas indiquées. Je tourne en rond d'image en pixmap en pixbuf en passant par des bitmap pour ne pas arriver à ce que je veux.

Si qqn a déjà utilisé cette biblio, peut-il me dire :
- comment changer les dimensions d'une image
- comment chenger le type d'encodage des pixels (je veux transformer une image RVB en intensité sur 2 octets).

Il y a un objet qui semble me permettre de faire cela d'une jolie façon (Rolling Eyes) :
- je crée un nouvel objet qui a les caractéristiques que je veux.
- je supprime l'ancien ...
c'est GtkDrawingArea avec gtk_drawing_area_size mais le pb c'est que c'est
Citation :
Un tel widget est essentiellement une fenêtre X et rien de plus. Il s'agit d'une toile vide sur laquelle nous pouvons dessiner ce que nous voulons.
Donc en gros un truc qui s'affiche à l'écran. Or je veux avant tout gérer cela en mémoire.

Il y a aussi GdkPixmap et la fonction gdk_pixmap_new qui permet de créer avec les dimensions et la profondeur souhaitées Mais quel lien entre les deux ? Je ne trouve pas de propriétés qui appartiennent à l'un ou l'autre qui permette de passer de l'un à l'autre. Utiliser le widget général ?

PeM, totalement perdu !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Loceka

avatar

Nombre de messages : 300
Date d'inscription : 10/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Dim 21 Oct 2007 - 22:53

Tu peux aller sur developper.com si tu as des questions précises, il y'a un forum GTK dessus :
http://www.developpez.net/forums/forumdisplay.php?f=336

Par contre c'est tout ce que je peux faire pour toi à mon niveau. ^^
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Lun 22 Oct 2007 - 0:03

Merci. c'est moins que rien.

Bon, je sens que si j'arrive à débrouiller ça, il y a un tuto qui va naitre !

C'est vraiment du n'importe quoi !

PeM Evil or Very Mad
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Lun 22 Oct 2007 - 20:37

Il semblerait que la solution ait été donnée sur ce site : http://www.developpez.net/forums/showthread.php?t=331351&highlight=image

C'est quand même tentaculaire est mal référencé : je n'ai vu de référence à la façon dont les données sont stockées que dans ce paragraphe de la fonction gdk_pixbuf_get_pixels ; il y a plein d'autres fonctions qui retournent des données (lesquelles ?) sous la forme d'un gchar * sans préciser la structure interne.

Je vais voir si c'est bien ce que je recherche.

PeM
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
[RV]



Nombre de messages : 94
Age : 34
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Lun 22 Oct 2007 - 21:49

Pem, consacre un site à ton problem, au moins ca sera bien référencé...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://blog-sciences.ath.cx/badaboom/
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Mar 23 Oct 2007 - 1:56

Sauvé ... sauvé à moitié.

À force de parcourir en long en large et en travers le site de gtk, je m'étais aperçu d'une chose qui ajoutait à l'exaspération de ne pas trouver les bonnes infos : selon la page, le lien "home" ne retournait pas à la même page d'index ...

Après avoir jeté un œil au lien du forum, j'ai brutalement noté une chose que je n'avais pas noté avant :
http://library.gnome.org/devel/gdk-pixbuf/unstable/gdk-pixbuf-gdk-pixbuf.html#image-data

Je passe sur le unstable. Rolling Eyes En fait, c'est le gDk qui m'a sauté aux yeux : je suis parti pour développer sous gTk qui recouvre gDk et je me retrouve à utiliser gDk parce que les fonctions de "bas" niveau ne sont pas disponibles sous gTk ! J'espère que ça va être portable !

Maintenant, ça me pose un autre pb ; manifestement, je vais pouvoir faire le boulot que je veux, charger une image depuis un fichier puis faire des opérations sur les pixels, mais j'ai un petit soucis : comment fait-on avec gDk pour afficher une image dans une fenêtre ? gTk fournit les outils, il fournit aussi le moyen de charger une image depuis un gTkPixbuf mais je me retrouve avec un gDkPixbuf ... Je le converti comment, si conversion il y a ?

PeM, qui va se repemcher sérieusement sur la restauration de kylix ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Loceka

avatar

Nombre de messages : 300
Date d'inscription : 10/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Mar 23 Oct 2007 - 19:34

Comme je suis toujours aussi nul en GTK, je continue dans mes propositions :

Il existe plein de logiciels open sources utilisant GTK, donc tu peux t'en inspirer (aMSN, etc.).

Sinon, Java fait ce que tu demandes sur les transformations d'image (et c'est portable) donc tu peux peut-être intégrer du code java dans ton programme (si c'est possible).

Celà dit je crois que GTK est surtout un langage de présentation, pour créer des interfaces graphiques, donc c'est pas sûr qu'il ait toute la puissance d'un langage plus générique.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Mer 24 Oct 2007 - 1:45

Sur le c/c++ en général, si j'ai une instruction

Code:
typedef struct _GdkImage GtkImage;
Est-ce que je peux faire un transtypage de ma variable
Code:
Gtkimage * image
avec _GdkImage :
Code:
gdk_pixbuf_from_image(_GdkImage(*image).pixbuf, ...)
?

Ca m'arrangerait beaucoup parce que le membre "pixbuf" de GtkImage n'existe pas selon le compilateur qui parle de la structure _GdkImage.

PeM
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Dim 11 Nov 2007 - 19:44

http://library.gnome.org/devel/gtk/2.12/GtkImage.html#gtk-image-new-from-file]gtk_image_new_from_file () a écrit:


GtkWidget* gtk_image_new_from_file (const gchar *filename);

Creates a new GtkImage displaying the file filename. If the file isn't found or can't be loaded, the resulting GtkImage will display a "broken image" icon. This function never returns NULL, it always returns a valid GtkImage widget.

If the file contains an animation, the image will contain an animation.

If you need to detect failures to load the file, use gdk_pixbuf_new_from_file() to load the file yourself, then create the GtkImage from the pixbuf. (Or for animations, use gdk_pixbuf_animation_new_from_file()).

The storage type (gtk_image_get_storage_type()) of the returned image is not defined, it will be whatever is appropriate for displaying the file.

filename :
a filename

Returns :
a new GtkImage

C'est-à-dire en substance " On vous ouvre une image, mais vous ne pourrez rien en faire !"


MouaaââÂÂâârrfffff !!!

C'est quoi ce truc de naze !?!?

PeM, dépité, qui ne peut même pas réduire gtk à la portion congrue ...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Sam 17 Nov 2007 - 14:55

Bon, j'ai récupérer une info cruciale : la fonction que j'utilise n'est pas celle qu'il faut ! (...)
J'ai donc modifié mon code, et j'ai plusieurs erreurs. En fait, tout ce compile toujours parfaitement, mais j'ai une erreur à l'exécution. Cela semble être un double problème de transtypage et de passage de paramètres (la chausse-trappe du C qui n'a été conçue que pour faire perdre du temps de développement ! %$*#&~!).

La première erreur commune vient de
Code:
  int err=0;
  GtkImage *Gimage;
  GdkPixbuf *pixtmp;

  err=ouvre_image(nom, pixtmp, GTK_WIDGET(Gimage), window);
qui retourne a l'exécution :
(16701): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkWidget'

Voici différentes versions du code et leur résultat : pourquoi cela ?
Code 1
Code:
int ouvre_image(char * nom, GdkPixbuf *GPimage, GtkWidget *GWimage, GtkWidget *window) {
/* ouvre le fichier image "nom" et le stocke dans l'objet GtkImage "*GWimage" */
  int err=0;
  GError **Gerr;

  GPimage =gdk_pixbuf_new_from_file(nom,Gerr);
  GWimage = gtk_image_new_from_pixbuf (GPimage);
  gtk_box_pack_start(GTK_BOX(pVBox), GWimage, FALSE, FALSE, 5);   //ajout au conteneur
  gtk_widget_show(GWimage);               //affichage
  return err;
}
Résultat : l'image est bien chargée depuis le fichier et affichée, mais avec l'erreur commune.

Code 2
Code:
int charge_image(char * nom, GdkPixbuf *GPimage) {
/* ouvre le fichier image "nom" et le stocke dans l'objet GdkPixbuf "*GPimage" */
  int err=0;
  GError **Gerr;

  GPimage =gdk_pixbuf_new_from_file(nom,Gerr);
  err=(GPimage==NULL);

  return err;
}

int affiche_image(GdkPixbuf *GPimage, GtkWidget *GWimage, GtkWidget *window) {
/* affiche le fichier image "nom" et le stocke dans l'objet GtkImage "*GWimage" */
  int err=0;
  GError **Gerr;
  GdkPixbuf *tmppix;

  GWimage = gtk_image_new_from_pixbuf (GPimage);
//affichage de l'image dans la fenêtre
  gtk_box_pack_start(GTK_BOX(pVBox), GWimage, FALSE, FALSE, 5);   //ajout au conteneur
  gtk_widget_show(GWimage);               //affichage

  return err;
}

int ouvre_image(char * nom, GdkPixbuf *GPimage, GtkWidget *GWimage, GtkWidget *window) {
/* ouvre le fichier image "nom" et le stocke dans l'objet GtkImage "*GWimage" */
  int err=0;
  GError **Gerr;

  err=charge_image(nom, GPimage);
  err= affiche_image(GPimage,GWimage, window);
  return err;
}

Résultat :
*** Processus interrompu. Erreur de segmentation ***

Code 3
Je garde la même première fonction et je remplace le seconde par
Code:
int ouvre_image(char * nom, GdkPixbuf *GPimage, GtkWidget *GWimage, GtkWidget *window) {
/* ouvre le fichier image "nom" et le stocke dans l'objet GtkImage "*GWimage" */
  int err=0;
  GError **Gerr;
GtkWidget *GWimage2;

  err=charge_image(nom, GPimage);
  GWimage2 = gtk_image_new_from_pixbuf (GPimage);
  gtk_box_pack_start(GTK_BOX(pVBox), GWimage2, FALSE, FALSE, 5);   //ajout au conteneur
  gtk_widget_show(GWimage2);               //affichage
  return err;
}
Même résultat.

Apparemment l'erreur proviendrait de charge_image() qui ne retournerait pas la bonne variable, ou bien créée. Pourtant, un pointeur lorsqu'il est passer en paramètre permet bien dans une fonction de créer la variable et d'attribuer l'adresse au pointeur. Donc, où est le pb ?! Les objets ne se comporteraient pas comme les autres variables (ce qui ne m'étonnerait plus guère en C/GTK). ?

Dernier exemple. J'ai encadré pour débugger la fonction charge_image() par deux impression de texte : le programme gèle, rien ne se passe, ni affichage des textes, ni interruption du programme ! Suspect No

Heeeeeeeeelp !!!!! affraid

PeM, Great Terrible Korrigan
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Sam 17 Nov 2007 - 20:07

Hé ! Vous savez quoi ? J'en ai une bonne !

Mon code était,
Code:
int extrait_spectre(vecteur spectre, char * nom, GtkWidget *window) {
/* gère toute l'extraction du spectre */
  int err=0;
  GtkImage *Gimage;   
  GdkPixbuf *pixtmp;

  err=ouvre_image(nom, pixtmp, GTK_WIDGET (Gimage), window);
}
Ce qui me donnait l'erreur "invalid unclassed pointer in cast to `GtkWidget'".

Jusqu'à ce que je tombe sur ceci.
cours gtk 2 a écrit:
Dans un premier temps, il faut déclarer un pointeur sur notre objet fenêtre. Bien que nous voulions créer un objet GtkWindow, il faut déclarer un objet GtkWidget.

GtkWidget *pWindow;

Par la suite, quel que soit l'objet à créer, il faudra toujours déclarer un GtkWidget.

Ni une ni deux, je me dis "ok gars ! Tu veux une image mais tu ne dois pas en déclarer (heu au fait, pourquoi ça existe alors les images ?) Rolling Eyes : laisse ta logique au vestiaire et applique les bons tuto sans erreur".

Voici donc mon code après correction :
Code:
int extrait_spectre(vecteur spectre, char * nom, GtkWidget *window) {
/* gère toute l'extraction du spectre */
  int err=0;
  GtkWidget *Gimage;   //une image comme tout objet est un widget ; pour que ce soit une image, on l'appelle juste image
  GdkPixbuf *pixtmp;

  err=ouvre_image(nom, pixtmp, Gimage, window);
}
Et vous ne devinerez jamais quoi ... ça plante, mais pas là ou j'ai fait la modif !!!
(3592): GdkPixbuf-CRITICAL **: gdk_pixbuf_new_from_file: assertion `error == NULL || *error == NULL' failed



MouaaaâaÂÂÂâââaaaarrrfffff !!!!


C'est vraiment du grand n'importe quoi à l'état pur.
C est ton amis.
Le développement en C : 98% à décrypter la logique des bibilo, 1% de programmation, 1% de vrai dégogage.

Sinon, pour info si je combine les deux codes en gardant le dernier avec le transtypage du premier, je retrouve l'état du premier.

PeM, qui se demande comment fonctionne un serveur X : ça doit être plus simple.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Loceka

avatar

Nombre de messages : 300
Date d'inscription : 10/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Sam 17 Nov 2007 - 20:23

En tout cas, merci pour les infos, je me mettrai jamais au gtk Evil or Very Mad
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pem



Nombre de messages : 912
Date d'inscription : 08/02/2007

MessageSujet: Re: Manipulation d'images avec gtk   Dim 18 Nov 2007 - 18:52

Citation :

Code:
  err=ouvre_image(nom, pixtmp, GTK_WIDGET (Gimage), window);
}
Ce qui me donnait l'erreur "invalid unclassed pointer in cast to `GtkWidget'".
Pour info, Gimage qui est un pointeur (défini pr GtkImage *Gimage) ne peut pas être transtypé pour la bonne est simple raison que ne peuvent être transtypé que des pointeurs alloués ...

Où est le temps jadis des fonctions C retournant des pointeurs void qu'on transtypait joyeusement en des pointeurs de type quelconque pointant n'importe où afin justement de leur attribuer une valeur correcte ?!

Pourquoi ça ne marche pas ici ? Parce que le transtypage par GTK_WIDGET vérifie que l'objet pointé est bien un GtkWidget, or il ne pointe vers rien, donc n'est pas acceptable.

Chienne de vie ! Si même les standards ne sont plus respectés !

PeM
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Manipulation d'images avec gtk   

Revenir en haut Aller en bas
 
Manipulation d'images avec gtk
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Manipulation d'images avec gtk
» déplacer des images avec open office????
» Le jeux des images avec numéros
» Le Tabernacle de Dieu avec les hommes ( 1) et (2)
» Un mois avec Maman Marie Prier Méditer Chanter

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORSV : Forum de Sciences et de Vie :: Sciences :: Informatique-
Sauter vers: