gpt4 book ai didi

linux - 在 Linux 中使用 gtk 显示一系列图像

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:42 29 4
gpt4 key购买 nike

我已经编写了一个简单的代码来使用 gtk 在窗口中显示原始图像缓冲区:

#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
const int Width = 1920, Height = 1080;
char *buffer = (char*)malloc(3 * Width * Height);

// Read a raw image data from the disk and put it in the buffer.
// ....

GtkWidget *window;
GtkWidget* image;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB,
FALSE, 8, Width, Height, Width*3, NULL, NULL);

gtk_window_set_title (GTK_WINDOW (window), "Image Viewer");

g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);

image = gtk_image_new_from_pixbuf (pixbuf);
gtk_container_add(GTK_CONTAINER (window), image);

gtk_widget_show_all (window);

gtk_main ();

free (buffer);
return 0;
}

如何更改此代码以像电影一样显示一系列 N 图像(即连续播放,而不是使用图像对话框手动选择图像)?主显示循环由 gtk_main() 控制,它在用户关闭窗口时结束。我认为将图像分配给图像小工具的循环应该在图像小工具的事件处理程序中,但我不知道该事件处理程序。

最佳答案

事实上,这微不足道的;)。

您需要了解,一旦您调用 gtk_main,一切都由 GLib“主循环”控制,这是一个事件循环,就像在几乎所有 GUI 工具包中一样。然后 GTK 将对其接收到的事件使用react。

因此您需要一种方法来创建这些事件。例如,如果你想定期执行一个 Action (这里的 Action 是“显示一张新图片”),你只需调用 g_timeout_add 并传递给它一个回调以每秒调用一次。使用 user_data 参数将指针传递给一个结构,您可以在其中轻松找到您的 GtkImage 以及您要显示的图像列表)。在回调中,您只需更改显示的图像,很可能使用 gtk_image_set_from_pixbuf

g_timeout_add_secondsg_timeout_add 做同样的事情,但精度较低(秒而不是毫秒),但它具有更省电的优势(更少的 CPU 唤醒= 节省更多能源)。

您可能还想以不同于计时器的方式触发操作。为此,您有 g_idle_add,它将在程序空闲时调用您的回调(没有要处理的事件)。

GLib main event loop 的文档中阅读这些函数的文档.

关于linux - 在 Linux 中使用 gtk 显示一系列图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844745/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com