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 :

Superposition image + transparence


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Superposition image + transparence
    Bonjour,

    J'aurai besoin d'un petit coup de main svp.

    J'essaie de superposer 2 images à travers des PixBuf , tout en supprimant le contour blanc autour de mon image.
    L'image de ma pièce est bien détourée mais je ne vois pas l'image de fond.

    Voici mon source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                pixbuf_piece = Gdk::Pixbuf::create_from_file(MY_DISC);
                pixbuf_bg = Gdk::Pixbuf::create_from_file(BLUE_BG);
                pixbuf_tmp = pixbuf_piece->add_alpha(true, 255, 255, 255);
                pixbuf_tmp2 = pixbuf_bg->add_alpha(false, 0, 0, 0);
                pixbuf_tmp->copy_area(0, 0, 40, 40, pixbuf_tmp2, 0, 0);
                _im = new Gtk::Image();
                _im->set(pixbuf_tmp2);
    Merci d'avance !

  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.

    Comme je ne programme plus avec gtkmm j'ai retranscris ton code en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      GdkPixbuf *pixbuf_piece = gdk_pixbuf_new_from_file ("./linux.jpg", NULL);
      GdkPixbuf *pixbuf_bg = gdk_pixbuf_new_from_file ("./fond.jpg", NULL);
      GdkPixbuf *pixbuf_tmp = gdk_pixbuf_add_alpha (pixbuf_piece, TRUE, 255, 255, 255);
      GdkPixbuf *pixbuf_tmp2 = gdk_pixbuf_add_alpha (pixbuf_bg, FALSE, 0, 0, 0);
      gdk_pixbuf_copy_area (pixbuf_tmp, 0, 0, 240, 240, pixbuf_tmp2, 10, 10);
    Effectivement les canaux alpha ne fonctionnent pas ici. Ceci est dû à la fonction ((ou la méthode) ...copy_area ();. Comme indiqué dans la doc. officielle tout est écrasé lors de la copie :

    If the source rectangle overlaps the destination rectangle on the same pixbuf, it will be overwritten during the copy operation.
    Je viens d'écrire une fonction similaire qui n'écrase pas les infos du canal alpha de la source copiée. Cette fonction est toute fraîche . Elle est sûrement perfectible. A toi de la modifier en fonction de tes besoins.

    Tu trouveras ci-après le code source exemple ainsi que les images utilisées. J'ai volontairement utilisé des jpg qui ne comportent pas de canal alpha. Le Linux a un fond blanc.

    Résultat obtenu :

    Nom : Capture d’écran_2020-08-29_17-36-21.png
Affichages : 165
Taille : 109,5 Ko


    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <gtk/gtk.h>
     
    void
    gdk_pixbuf_copy_area_with_alpha (const GdkPixbuf *src_pixbuf,
    				 guint src_x, guint src_y, guint width, guint height,
    				 GdkPixbuf *dest_pixbuf, guint dest_x, guint dest_y)
    {
      g_return_if_fail (GDK_IS_PIXBUF (src_pixbuf));
      g_return_if_fail (GDK_IS_PIXBUF (dest_pixbuf));
      if (!gdk_pixbuf_get_has_alpha (src_pixbuf) || !gdk_pixbuf_get_has_alpha (src_pixbuf)) return;
     
      gint dest_width  = width-src_x;
      gint dest_height = height-src_y;
     
      if (dest_width<0) return;
      if (dest_height<0) return;
     
      if (dest_x + dest_width > gdk_pixbuf_get_width (dest_pixbuf))
        dest_width = gdk_pixbuf_get_width (dest_pixbuf) - dest_x;
     
      if (dest_y + dest_height > gdk_pixbuf_get_height (dest_pixbuf))
        dest_height = gdk_pixbuf_get_height (dest_pixbuf) - dest_y;
     
      guchar *src_pixels = gdk_pixbuf_get_pixels (src_pixbuf);
      guchar *dest_pixels = gdk_pixbuf_get_pixels (dest_pixbuf);
      gint src_rowstride = gdk_pixbuf_get_rowstride (src_pixbuf);
      gint dest_rowstride = gdk_pixbuf_get_rowstride (dest_pixbuf);
      for (gint y=src_y; y < dest_height; y++, dest_y++)
        for (gint x=src_x; x < dest_width; x++)
          {
    	if (src_pixels [x*4 + y*src_rowstride + 3]==255)
    	  {
    	    dest_pixels [(dest_x+(x-src_x))*4 + dest_y*dest_rowstride] = src_pixels [x*4 + y*src_rowstride];
    	    dest_pixels [(dest_x+(x-src_x))*4 + dest_y*dest_rowstride + 1] = src_pixels [x*4 + y*src_rowstride + 1];
    	    dest_pixels [(dest_x+(x-src_x))*4 + dest_y*dest_rowstride + 2] = src_pixels [x*4 + y*src_rowstride + 2];
    	    dest_pixels [(dest_x+(x-src_x))*4 + dest_y*dest_rowstride + 3] = src_pixels [x*4 + y*src_rowstride + 3];
    	  }
          }
    }
     
    gint
    main(int argc, gchar **argv)
    {
      gtk_init (&argc, &argv);
     
      GdkPixbuf *pixbuf_piece = gdk_pixbuf_new_from_file ("./linux.jpg", NULL);
      GdkPixbuf *pixbuf_bg = gdk_pixbuf_new_from_file ("./fond.jpg", NULL);
      GdkPixbuf *pixbuf_tmp = gdk_pixbuf_add_alpha (pixbuf_piece, TRUE, 255, 255, 255);
      GdkPixbuf *pixbuf_tmp2 = gdk_pixbuf_add_alpha (pixbuf_bg, FALSE, 0, 0, 0);
      gdk_pixbuf_copy_area_with_alpha (pixbuf_tmp, 0, 0, 240, 240, pixbuf_tmp2, 10, 10);
     
      GtkWidget *_im = gtk_image_new_from_pixbuf (pixbuf_tmp2);
     
      GtkWidget *mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_container_add (GTK_CONTAINER(mainwindow), _im);
     
     
      // Affectation des différents signaux
      g_signal_connect (G_OBJECT(mainwindow), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
      // Affichage du tout.
      gtk_widget_show_all(mainwindow);
     
      // Boucle principale
      gtk_main();
     
      return 0;
    }
    Images utilisées :
    Nom : fond.jpg
Affichages : 162
Taille : 18,9 Ko

    Nom : linux.jpg
Affichages : 161
Taille : 45,8 Ko

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour votre réponse limpide.

    J'ai adapté votre fonction et cela fonctionne parfaitement !
    J'aurai pu chercher longtemps étant donné que la fonction copy_area ne gère pas le canal alpha...
    Et je n'avais pas compris le terme "overlap" dans la doc, c'est maintenant plus clair.

Discussions similaires

  1. [swing][image] transparence
    Par harold63 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/12/2015, 19h26
  2. Fond d'une Image transparent
    Par master_thunder dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 09/06/2006, 10h31
  3. [CSS] Superposition image au dessus d'une table
    Par laurent_h dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 31/03/2006, 18h45
  4. Superposition Images
    Par mrshoki dans le forum 2D
    Réponses: 3
    Dernier message: 09/02/2006, 09h36
  5. Réponses: 8
    Dernier message: 06/07/2004, 19h30

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