2010-06-15 7 views
0

Следующий скрипт сделает снимок экрана на рабочем столе Gnome.Преобразование скрипта python GTK в C

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

Что у вас есть? – Ken

+0

Ну, я сначала попробую с некоторыми дополнениями к GTK (см. Http://maemo.org/api_refs/5.0/beta/hildon/hildon-Additions-to-GTK+.html и образец для скриншота в http: // maemo .gitorious.org/hildon/hildon/blobs/hildon-2-2/examples/hildon-gtk-window-take-screenshot-sync.c), но это принесло черты зависимостей, затем я попробовал XGetImage (http: // tronche.com/gui/x/xlib/graphics/XGetImage.html), но для этого кода нужны библиотеки Xorg devel для компиляции ... вы можете увидеть здесь пример этого: http://www.codase.com/ search/call? name = xgetimage, и теперь я застрял – Jessica

+1

Перевести это буквально, 'gtk.gdk.get_default_root_window' становится' gdk_get_default_root_window' и т. д.! – u0b34a0f6ae

ответ

3

Я тестировал это, и он действительно работает, но может быть более простой способ перейти от 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); 
+1

gdk_pixbuf_save: http://library.gnome.org/devel/gdk-pixbuf/unstable/gdk-pixbuf3-file-saving.html#gdk-pixbuf-save – u0b34a0f6ae

+0

ах, не видел, что ... должен использовать искать в devhelp ... ah well – Spudd86

+0

фантастический, спасибо. Так же, как побочный вопрос, gdk_get_default_root_window() даст мне рабочий стол, есть ли способ получить текущее окно? – Jessica

Смежные вопросы