【问题标题】:get a snapshot of GtkDrawingArea with GTK3, bug on WIndows?使用 GTK3 获取 GtkDrawingArea 的快照,Windows 上的错误?
【发布时间】:2020-12-12 06:50:26
【问题描述】:

我正在寻找从 GtkDrawingArea 获取 pixbuf 的最佳方式。 我看到有两种方法可以做到这一点。

  • 首先我可以使用gdk_pixbuf_get_from_surface。这样做可能很容易,但我只是将图片映射到 GtkDrawingArea 中,而不是用 cairo 制作的画。
  • 第二,gdk_pixbuf_get_from_window。这是我选择的方式,因为我认为它符合我的需求。确实,我想要的只是对我的绘图区域进行快速快照,并在图片上绘制所有标签和绘画。

我的以下代码在 GNU/Linux 上按预期工作,但在给我黑色 png 的 Windows 上。有人可以帮我解决这个问题吗?

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);
    }
}

【问题讨论】:

    标签: c gtk3


    【解决方案1】:

    我现在有了答案。

    从窗口获取 pixbuf 的 API 几乎是 GTK 仅 X11 时代的残余。所以不要期望让它在 GNU/Linux X11 环境之外工作。该函数也已从 GTK4 API 中删除。

    所以,最好的方法是使用gdk_pixbuf_get_from_surface 并重新绘制我需要的内容。

    我想我也可以使用GtkOffscreenWindow,但我没有资助任何使用示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2016-08-30
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多