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

GTK+ avec C & C++ Discussion :

Récupérer les couleurs d'une image - Violation d'accès


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Récupérer les couleurs d'une image - Violation d'accès
    Bonjour, je cherche à récupérer les couleurs d'une image afin de la passer en gris.

    Pour cela j'utilise une fonction on_click_button_grey qui récupère un builder :

    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
     
    void on_click_button_grey(GtkButton *button, gpointer user_data){
    	GtkBuilder *builder = (GtkBuilder*)user_data;
    	GdkPixbuf *pixbuf = NULL;
    	GtkImage *image1 = NULL;
     
    	int w = 0;
    	int h = 0;
    	int x = 0;
    	int y = 0;
    	int gris = 0;
     
    	guchar *red= NULL;
    	guchar *green = NULL;
    	guchar *blue = NULL;
    	guchar *buffer=NULL;
    	gint pos = 0;
    	gint row_size = 0;
     
    	image1 = GTK_IMAGE(gtk_builder_get_object(builder, "image1"));
     
    	pixbuf = gdk_pixbuf_new_from_file("image.png", NULL);
    	w = gdk_pixbuf_get_width(pixbuf);
    	h = gdk_pixbuf_get_height(pixbuf);
     
    	buffer = gdk_pixbuf_get_pixels(pixbuf);
    	row_size = gdk_pixbuf_get_rowstride(pixbuf);
     
    	for (y = 0; y < h; y++) {
    		for (x = 0; x < w; x++) {
     
    			if (gdk_pixbuf_get_has_alpha(pixbuf))
    				pos = (y * row_size) + (x * 4);
    			else
    				pos = (y * row_size) + (x * 3);
     
    			*red = buffer[pos];
    			*green = buffer[pos + 1];
    			*blue = buffer[pos + 2];
     
    			gris = (int)(*red*0.3 + *green*0.59 + *blue*0.11);
     
    			buffer[pos] = gris;
    			buffer[pos + 1] = gris;
    			buffer[pos + 2] = gris;
     
    		}
    	}
     
    	gtk_image_set_from_pixbuf(image1, pixbuf);
    	g_object_unref(pixbuf);
     
    	return;
    }
    Malheureusement lors de l'exécution du programme j'ai une erreur de violation d'accés que je ne comprends pas en ligne 37, c'est à dire au moment où je veux renseigner *red.

    Nom : Capture1.PNG
Affichages : 238
Taille : 14,6 Ko

    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Lorsque tu manipules des pointeurs il est fortement conseillé de toujours vérifier leur validité.

    Au vu de la réponse de ton compilateur, il semblerait que buffer pointe sur l'adresse 0x0000, c'est à dire la valeur NULL !

    Si on reprend la documentation de gdk_pixbuf_new_from_file (); cette fonction peut renvoyer NULL si elle a rencontré des problèmes.
    Returns

    A newly-created pixbuf with a reference count of 1, or NULL if any of several error conditions occurred: the file could not be opened, there was no loader for the file's format, there was not enough memory to allocate the image buffer, or the image file contained invalid data.
    Donc ton code devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    pixbuf = gdk_pixbuf_new_from_file("image.png", NULL);
    g_return_if_fail (pixbuf);
    ...
    Cette fonction évalue l'expression entre parenthèses. S'il est fausse on sort. Ceci équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pixbuf==NULL) return;
    À partir de là, si l'exécution du code se poursuit tu sais que ton pixbuf est correctement initialisé.

    Autre petite remarque. Pourquoi initialiser des pointeurs pour les couleurs ? De simples variables suffisent ici il me semble. Ca simplifierait aussi l’écriture du code source.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 442
    Points : 43 086
    Points
    43 086
    Par défaut
    Je fais pas de programmation, je vais donc peut-être dire une bêtise, tu appelles un pointeur red en ligne 37 sur laquelle tu n'as pas fait de malloc avant.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Pour gérer correctement l'erreur, il faut la récupérer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pixbuf = gdk_pixbuf_new_from_file("image.png", NULL);
    Le second argument, où tu passes NULL, est en fait l'adresse d'un pointeur où récupérer des informations sur l'erreur en utilisant GError.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GError *error = NULL;
    pixbuf = gdk_pixbuf_new_from_file("image.png", &error);
    if (error != NULL)
        g_error("%s", error->message);
    g_error permet de tracer (logger) l'erreur, et comme c'est une erreur fatale, d'arrêter le programme, tout en affichant la cause de l'erreur. Vraisemblablement le fichier image n'est pas trouvé (sans doute parce que tu as mis un chemin relatif mais pas relatif au bon dossier; teste avec un chemin absolu pour voir), ou est mal nommé.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

Discussions similaires

  1. Récupérer les couleurs d'une image
    Par benthebest dans le forum Android
    Réponses: 2
    Dernier message: 06/02/2012, 23h33
  2. [VB.Net] Comment récupérer les proprietes d'une image ?
    Par Cirdan Telemnar dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/06/2006, 16h15
  3. Réponses: 3
    Dernier message: 10/03/2006, 14h15
  4. [Graphique] Comment compter les couleurs d'une image ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 27
    Dernier message: 16/02/2005, 18h17

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