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 :

ecrire sur un pixbuf.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut ecrire sur un pixbuf.
    Bonjour,

    Je souhaite savoir si je peux écrire des chaines de caractères sur un pixbuf facilement.

  2. #2
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    j'ai vu que pour enregistrer en jpg, il y a la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	gdk_pixbuf_save(pixbuf,nom,"jpeg",NULL,"quality","100",NULL);
    mais elle nécessite un pixbuf. Comment mettre des phrases sur un pixbuf ?

    Pour écrire il y a les fonctions de pango :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	p_context = gtk_widget_get_pango_context (p_drawing_area);
    	p_layout = pango_layout_new (p_context);
    	pango_layout_set_text (p_layout, "Hello World !", -1);
    	gdk_draw_layout (p_drawing_area->window,p_drawing_area->style->fg_gc[GTK_WIDGET_STATE (p_drawing_area)], 0,0,p_layout);
    	g_object_unref (p_layout);
    mais comment choisir "p_drawing_area" pour que les fonctions de panga le modifie sans qu'il soit affiché et comment passer de ce widget à un pixbuf.

  3. #3
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    j'ai vu d'autres fonction mais je ne suis pas sûr de leur utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void char2pixbuf(const gchar *texte, const char *nom)
    {
    	GdkPixbuf *pixbuf;
    	GtkTextBuffer *text_buffer;
    	GtkTextIter iter;
     
    	text_buffer=gtk_text_buffer_new(NULL);
    	gtk_text_buffer_get_start_iter(text_buffer,&iter);
    	gtk_text_buffer_set_text(GTK_TEXT_BUFFER(text_buffer),"test",-1);
    	gtk_text_buffer_insert_pixbuf(GTK_TEXT_BUFFER(text_buffer),&iter,pixbuf);
    	gdk_pixbuf_save(pixbuf,nom,"jpeg",NULL,"quality","100",NULL);
    }

  4. #4
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    je veux remplir un tableau à 3 dimension représentant une image connaissant le texte qui constitura l'image. J'avais pensé aux pixbuf mais je ne vois pas comment faire.

    edit : peut-on charger une lettre contenu dans un fichier de police (.ttf) directement dans un pixbuf ?

  5. #5
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    est-ce que le fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GdkPixbuf* gtk_text_iter_get_pixbuf (const GtkTextIter *iter);
    peut permettre de récupérer un texte dans un pixbuf ?

    Est-ce possible sans afficher le GtkTextBuffer ?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu dois pouvoir le faire via une surface cairo (je peux pas t'en dire plus, j'en sais guère plus

  7. #7
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    je pense que c'est bon avec cairo. Merci

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Prends garde à utiliser pango pour écrire ton texte sur ta surface cairo, les APIs cairo_draw_text & co sont très simplistes.

  9. #9
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    j'ai le code suivant (plus ou moins celui du site de cairo :

    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
    #define TAILLE_TEXTURE 512
    #define TAILLE_POLICE 0.1
     
    void char2png(char *text, const char *fichier)
    {
    	/* Variable declarations */
    	cairo_surface_t *surface;
    	cairo_t *cr;
    	double x, y, px, ux=1, uy=1, dashlength;
    	cairo_font_extents_t fe;
    	cairo_text_extents_t te;
     
    	/* Prepare drawing area */
    	surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, TAILLE_TEXTURE, TAILLE_TEXTURE);
    	cr = cairo_create (surface);
     
    	/* Example is in 26.0 x 1.0 coordinate space */
    	cairo_scale (cr, TAILLE_TEXTURE, TAILLE_TEXTURE);
    	cairo_set_font_size (cr, TAILLE_POLICE);
     
    	/* Drawing code goes here */
    	cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
    	cairo_select_font_face (cr, "Arial",CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    	cairo_font_extents (cr, &fe);
     
    	cairo_device_to_user_distance (cr, &ux, &uy);
    	if (ux > uy)
    		px = ux;
    	else
    		px = uy;
    	cairo_font_extents(cr, &fe);
    	cairo_text_extents(cr, text, &te);
    	x = 0.5 - te.x_bearing - te.width / 2;
    	y = 0.5 - fe.descent + fe.height / 2;
     
    	/* text */
    	cairo_move_to(cr, x, y);
    	cairo_set_source_rgb(cr, 0, 0, 0);
    	cairo_show_text (cr, text);
     
    	/* Write output and clean up */
    	cairo_surface_write_to_png (surface, fichier);
    	cairo_destroy (cr);
    	cairo_surface_destroy (surface);
    }
    mais je ne sais pas utiliser pango, pour le moment si je mets un '\n' dans le texte, ça ne marche pas.

    Enfin je voudrais redimmensionner la taille de l'image à la taille du texte, comment faire ?

  10. #10
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    comment connaitre la taille que prend un texte (via pango) ou paramètré celui-ci pour qu'il retourne à la ligne quand on dépasse la largeur de la surface (cairo_surface_t),
    comment redimmensionner un pango_layout ?

  11. #11
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    j'ai le code suivant :

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #include <math.h>
    #include <string.h>
    #include <stdlib.h>
    #include <pango/pangocairo.h>
     
     
    #define NB_MAX_LETTRES 25
    #define TAILLE 150
    #define BORDS 15
    #define FONT "Arial 8"
     
    /* Force des retour à la ligne dans chaine à l'espace précédent un mot si le nombre de lettres dépasse nbmax.
    Si un mot est plus long que nbmax, il sera laissé tel quel */
    char *chaine_limite(char *chaine, int nbmax)
    {
    	char *tmp;
    	int i, cpt, espace;
     
    	i=0;
    	cpt=0;
    	espace=0;
    	while( chaine[i]!='\0' )
    	{
    		if (chaine[i]==' ')
    			espace=1;
     
    		if ( cpt>=nbmax && espace==1 )
    		{
    			while(chaine[i]!=' ')
    				i--;
    			chaine[i]='\n';
    			espace=0;
    			cpt=0;
    		}
    		i++;
    		cpt++;
    	}
     
    	return chaine;
    }
     
     
    void char2png(const char *texte, const char *fichier)
    {
      cairo_t *cr;
      cairo_status_t status;
      cairo_surface_t *surface;
      PangoLayout *layout;
      PangoFontDescription *desc;
      int width, height;
     
      surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, TAILLE, TAILLE);
      cr = cairo_create (surface);
     
      cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
      cairo_paint (cr);
     
      /* Center coordinates on the middle of the region we are drawing */
      cairo_translate (cr, TAILLE, TAILLE);
     
      /* Create a PangoLayout, set the font and text */
      layout = pango_cairo_create_layout (cr);
      pango_layout_set_text (layout, chaine_limite(g_strdup_printf("%s",texte),NB_MAX_LETTRES), -1);
      desc = pango_font_description_from_string (FONT);
      pango_layout_set_font_description (layout, desc);
      pango_font_description_free (desc);
     
      cairo_save (cr);
     
    		/* couleur du texte */
      cairo_set_source_rgb (cr, 0, 0, 0);
     
          /* Inform Pango to re-layout the text with the new transformation */
      pango_cairo_update_layout (cr, layout);
     
      pango_layout_get_size (layout, &width, &height);
      cairo_move_to (cr, - TAILLE+BORDS , - TAILLE);
      pango_cairo_show_layout (cr, layout);
      cairo_restore (cr);
     
      /* free the layout object */
      g_object_unref (layout);
      cairo_destroy (cr);
     
      status = cairo_surface_write_to_png (surface, fichier);
     
      if (status != CAIRO_STATUS_SUCCESS)
        {
          g_printerr ("Could not save png to '%s'\n", fichier);
        }
     
    }
     
    int main (int argc, char **argv)
    {
     
      char2png("auditoire, voili voilou, connaotation dénotation, etc etc etc , putain qu'est ce qu'on se fait chié !!!","test.png");
     
      return 0;
    }
    Ca marche mais je cherche toujours une solution pour adapter la cairo_surface au texte.

    edit : avec je code je crée une image qui est ensuite reparcouru pour être mise dans un tableau t[largeur][hauteur][3], y a t-il un moyen plus rapide de faire cela ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ecrire sur la meme ligne avec la commane ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 24/11/2015, 10h06
  2. Ecrire sur un Timage
    Par giloutho dans le forum Delphi
    Réponses: 6
    Dernier message: 01/04/2007, 18h12
  3. Ecrire sur 2 cases
    Par javaSudOuest dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 24/10/2005, 18h37
  4. Interdire à X d'écrire sur le disque dur, possible ?
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 29/10/2004, 17h50
  5. ecrire sur un dbgrid ??
    Par nil dans le forum Bases de données
    Réponses: 8
    Dernier message: 21/04/2004, 23h40

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