Преобразовать скрипт Python GTK в C - PullRequest
0 голосов
/ 15 июня 2010

Следующий скрипт сделает снимок экрана на рабочем столе Gnome.

import gtk.gdk

w = gtk.gdk.get_default_root_window()
sz = w.get_size()
pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False, 8, sz[0], sz[1])
pb = pb.get_from_drawable(w, w.get_colormap(), 0, 0, 0, 0, sz[0], sz[1])
if (pb != None):
    pb.save("screenshot.png", "png")
    print "Screenshot saved to screenshot.png."
else:
    print "Unable to get the screenshot."

Теперь я пытался преобразовать это в C и использовать в одном из приложений, которые я пишу, но покаЯ был неудачным.Есть ли что сделать в C (в Linux)?

Спасибо!Джесс.

1 Ответ

3 голосов
/ 15 июня 2010

Я проверил это, и оно работает, но может быть более простой путь перехода от GdkPixbuf к png, это был только первый, который я нашел.(Нет gdk_pixbuf_save())

#include <unistd.h>
#include <stdio.h>
#include <gdk/gdk.h>
#include <cairo.h>

int main(int argc, char **argv)
{
    gdk_init(&argc, &argv);

    GdkWindow *w = gdk_get_default_root_window();

    gint width, height;
    gdk_drawable_get_size(GDK_DRAWABLE(w), &width, &height);

    GdkPixbuf *pb = gdk_pixbuf_get_from_drawable(NULL, 
                       GDK_DRAWABLE(w), 
                       NULL, 
                       0,0,0,0,width,height);

    if(pb != NULL) {
        cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 
                                                           width, height);
        cairo_t *cr = cairo_create(surf);
        gdk_cairo_set_source_pixbuf(cr, pb, 0, 0);
        cairo_paint(cr);
        cairo_surface_write_to_png(surf, "screenshot.png");
        g_print("Screenshot saved to screenshot.png.\n");
    } else {
        g_print("Unable to get the screenshot.\n");
    }
    return 0;
}

, который вы скомпилируете следующим образом: (при условии, что вы сохраните его как screenshot.c)

gcc -std=gnu99 `pkg-config --libs --cflags gdk-2.0` screenshot.c -o screenshot

Edit: материал для сохранения pixbufтакже может выглядеть так: (обратите внимание, я не пробовал это, но это только одна строка ...) Спасибо kaizer.se за указание на мою ошибку при чтении документа: P

gdk_pixbuf_save(pb, "screenshot.png", "png", NULL, NULL);
...