2011-04-16 23 views
2

我希望能够从开罗表面制作GtkImage(无需编写临时文件)。如何从开罗表面创建GtkImage?

我现在写的表面,PNG的字符数组,然后我喂到PixbufLoader得到一个pixbuf的,我用它来创建GtkImage:

typedef struct 
{ 
    unsigned char *pos; 
    unsigned char *end; 
} closure_t; 

static cairo_status_t 
png_to_array (void *closure, const unsigned char *data, unsigned int length) 
{ 
    closure_t *cl = (closure_t *) closure; 

    if ((cl->pos + length) > (cl->end)) 
     return CAIRO_STATUS_WRITE_ERROR; 

    memcpy (cl->pos, data, length); 
    cl->pos += length; 

    return CAIRO_STATUS_SUCCESS; 
} 


// later in the code 
cairo_surface_t *surface = ... 

... 

// how would i determine the right size? 
unsigned char arr[...]; 
closure_t cl; 
GtkWidget *image; 
GdkPixbufLoader *pbloader; 
GdkPixbuf *pb; 

// copy surface png to arr 
cl.pos = arr; 
cl.end = arr + sizeof(arr); 
cairo_surface_write_to_png_stream (surface, 
        (cairo_write_func_t) png_to_array, 
        &cl); 

... 
// write to pixbufloader, get pixbuf, create image 
pbloader = gdk_pixbuf_loader_new(); 
gdk_pixbuf_loader_write(pbloader, arr, sizeof(arr), NULL); 
gdk_pixbuf_loader_close(pbloader, NULL); 

pb = gdk_pixbuf_loader_get_pixbuf(pbloader); 

image = gtk_image_new_from_pixbuf(pb); 
  1. 这似乎相当麻烦 - ISN”有没有更简单的方法来做到这一点?
  2. 我如何确定我的例子中的数组的大小?

回答

0

一个函数将为您节省大量的精力。查找gdk_pixbuf_get_from_surface。它从cairo_surface_t获得一个Pixbuf。当他写这篇文章的时候,只有在使用Gdk-3.0的时候才可以使用,这也意味着使用Gtk + -3.0。

粗,如果你想使用GTK + -2.0,那么你可以创建一个像素图,得到cairo_t从中再由

cairo_set_source_surface (cr, surface, x0, y0); 
cairo_rectangle (cr, x0 + x, y0 + y, width, height); 
cairo_fill (cr); 

你的其他cairo_surface_t复制到如何创建一个像素图是一个例子下面,我会让你填写其余的。

#include <gtk/gtk.h> 
#include <cairo/cairo.h> 


int main(gint argc, gchar *argv[]) 
{ 
    GdkPixmap *pixmap; 
    GtkWidget *image; 
    GtkWidget *window; 
    cairo_t *cr; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(gtk_main_quit), NULL); 

    gtk_widget_show_all(window); 

    pixmap = gdk_pixmap_new(window->window, 100, 100, -1); 
    cr = gdk_cairo_create(pixmap); 
    cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);  
    cairo_rectangle(cr, 10, 10, 80, 80); 
    cairo_fill(cr); 
    cairo_destroy(cr); 

    cr = NULL; 



    image = gtk_image_new_from_pixmap(pixmap, NULL); 

    gtk_container_add(GTK_CONTAINER(window), image); 


    gtk_widget_show(image); 



    gtk_main(); 

    return 0; 
}