Bonjour,
Je souhaite savoir si je peux écrire des chaines de caractères sur un pixbuf facilement.
Version imprimable
Bonjour,
Je souhaite savoir si je peux écrire des chaines de caractères sur un pixbuf facilement.
j'ai vu que pour enregistrer en jpg, il y a la fonction :
mais elle nécessite un pixbuf. Comment mettre des phrases sur un pixbuf ?Code:gdk_pixbuf_save(pixbuf,nom,"jpeg",NULL,"quality","100",NULL);
Pour écrire il y a les fonctions de pango :
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.Code:
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);
j'ai vu d'autres fonction mais je ne suis pas sûr de leur utilisation :
Code:
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); }
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 ?
est-ce que le fonction :
peut permettre de récupérer un texte dans un pixbuf ?Code:GdkPixbuf* gtk_text_iter_get_pixbuf (const GtkTextIter *iter);
Est-ce possible sans afficher le GtkTextBuffer ?
Tu dois pouvoir le faire via une surface cairo (je peux pas t'en dire plus, j'en sais guère plus :)
je pense que c'est bon avec cairo. Merci :)
Prends garde à utiliser pango pour écrire ton texte sur ta surface cairo, les APIs cairo_draw_text & co sont très simplistes.
j'ai le code suivant (plus ou moins celui du site de cairo :
mais je ne sais pas utiliser pango, pour le moment si je mets un '\n' dans le texte, ça ne marche pas.Code:
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); }
Enfin je voudrais redimmensionner la taille de l'image à la taille du texte, comment faire ?
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 ?
j'ai le code suivant :
Ca marche mais je cherche toujours une solution pour adapter la cairo_surface au texte.Code:
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; }
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 ?