在 Linux 中使用 gtk 显示图像序列
Display a sequence of images using gtk in Linux
我已经编写了一个简单的代码来使用 gtk:
在 window 中显示原始图像缓冲区
#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()
控制,当用户关闭 window 时结束。我认为将图像分配给图像小工具的循环应该在图像小工具的事件处理程序中,但我不知道该事件处理程序。
事实上,这个是微不足道的;)。
您需要了解,一旦您调用 gtk_main
,一切都由 GLib "main loop" 控制,这是一个事件循环,就像在几乎所有 GUI 工具包中一样。然后 GTK 将对其接收到的事件做出反应。
因此您需要一种方法来创建这些事件。例如,如果你想定期执行一个动作(这里的动作是 "display a new picture"),你只需调用 g_timeout_add
并传递给它一个回调以每秒调用一次。使用 user_data
参数将指针传递给一个结构,您可以在其中轻松找到 GtkImage
以及要显示的图像列表)。在回调中,您只需更改显示的图像,最有可能使用 gtk_image_set_from_pixbuf
.
g_timeout_add_seconds
与 g_timeout_add
做同样的事情,但精度较低(秒而不是毫秒),但它具有更省电的优点(更少 CPU 唤醒= 节省更多能源)。
您可能还想以不同于计时器的方式触发操作。为此,你有 g_idle_add
它将在程序空闲时调用你的回调(没有要处理的事件)。
在 GLib main event loop 的文档中阅读这些函数的文档。
我已经编写了一个简单的代码来使用 gtk:
在 window 中显示原始图像缓冲区#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()
控制,当用户关闭 window 时结束。我认为将图像分配给图像小工具的循环应该在图像小工具的事件处理程序中,但我不知道该事件处理程序。
事实上,这个是微不足道的;)。
您需要了解,一旦您调用 gtk_main
,一切都由 GLib "main loop" 控制,这是一个事件循环,就像在几乎所有 GUI 工具包中一样。然后 GTK 将对其接收到的事件做出反应。
因此您需要一种方法来创建这些事件。例如,如果你想定期执行一个动作(这里的动作是 "display a new picture"),你只需调用 g_timeout_add
并传递给它一个回调以每秒调用一次。使用 user_data
参数将指针传递给一个结构,您可以在其中轻松找到 GtkImage
以及要显示的图像列表)。在回调中,您只需更改显示的图像,最有可能使用 gtk_image_set_from_pixbuf
.
g_timeout_add_seconds
与 g_timeout_add
做同样的事情,但精度较低(秒而不是毫秒),但它具有更省电的优点(更少 CPU 唤醒= 节省更多能源)。
您可能还想以不同于计时器的方式触发操作。为此,你有 g_idle_add
它将在程序空闲时调用你的回调(没有要处理的事件)。
在 GLib main event loop 的文档中阅读这些函数的文档。