Я ищу лучший способ получить pixbuf из GtkDrawingArea. Я вижу два способа сделать это.
gdk_pixbuf_get_from_surface
. Это может быть легко, но я просто отображаю изображение в GtkDrawingArea, а не рисунок, сделанный с помощью cairo.gdk_pixbuf_get_from_window
. Я выбираю этот путь, потому что считаю, что он соответствует моим потребностям. Действительно, я хочу просто сделать быстрый снимок области рисования со всеми надписями и рисунками, нарисованными на картинке.Мой следующий код работает, как и ожидалось, в GNU/Linux, но в Windows это дает мне черный png. Кто-нибудь может помочь мне решить проблему?
gtk_widget_get_allocation(widget, &allocation_w);
GdkWindow *window = gtk_widget_get_parent_window(widget);
if (window) {
pixbuf = gdk_pixbuf_get_from_window(window, allocation_w.x, allocation_w.y, allocation_w.width, allocation_w.height);
if (pixbuf) {
file = g_file_new_build_filename(com.wd, filename, NULL);
g_free(filename);
stream = (GOutputStream*) g_file_replace(file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &error);
if (stream == NULL) {
if (error != NULL) {
g_warning("%s\n", error->message);
g_clear_error(&error);
}
g_object_unref(pixbuf);
g_object_unref(file);
return;
}
gdk_pixbuf_save_to_stream_async(pixbuf, stream, "png", NULL,
snapshot_callback, (gpointer) g_file_get_basename(file), NULL);
g_object_unref(stream);
g_object_unref(pixbuf);
g_object_unref(file);
}
}
Теперь у меня есть ответ.
API для получения pixbuf из окна в значительной степени является пережитком того времени, когда GTK был только для X11. Так что не ждите, что он будет работать вне среды GNU/Linux X11. Эта функция также удалена из API GTK4.
Итак, лучший способ — использовать gdk_pixbuf_get_from_surface
и перерисовывать то, что мне нужно.
Думаю, я тоже мог бы использовать GtkOffscreenWindow, но я не финансировал ни одного примера использования.