如何刷新GTK图像?

时间:2018-03-04 22:00:56

标签: c gtk opencl

嗨,来自Stackoverflow的人,我对编程有一些了解,但不是很多。我的想法是在c中编写类似于视频游戏或可视化器的东西,为此我制作并处理一个代表图像的数组,它必须可视化并且总是被刷新,就像视频游戏一样。我已经完成了算法,我需要优化它,我的意思是我知道如何在任何时候创建表示图像的数组,我现在需要的是将其可视化为动画,然后使用opencl进行优化。 我想做的程序必须做这样的事情: “创造形象” “渲染它”, “创造形象” “渲染它”, ...
出于这个原因,我知道我可以从一个非常简单的例子轻松开始,我不必学习GTK的所有内容。我一直在寻找简单的例子并试图理解它是如何工作的,但它没有帮助,我只需要做那个简单的动作,刷新它。某处的命令应该足够了。

#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <glib.h>
const int Width = 1200, Height = 800;
char *buffer;

int i = 0;
GdkPixbuf *pixbuf;
GtkWidget *window;
GtkWidget* image;


void delay(int number_of_seconds){
    int milli_seconds = 1000 * number_of_seconds;
    clock_t start_time = clock();
    while (clock() < start_time + milli_seconds);
}


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

    // CREATE AN IMAGE IN BUFFER SOMEHOW
    // buffer = something; 
    // 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    pixbuf = gdk_pixbuf_new_from_data (buffer, GDK_COLORSPACE_RGB, FALSE, 8, Width, Height, (Width)*3, NULL, NULL);
    image = gtk_image_new_from_pixbuf (pixbuf);
    gtk_container_add(GTK_CONTAINER (window), image);
    gtk_window_set_title (GTK_WINDOW (window), "Visualizador");
    gtk_widget_show_all (window);
    delay(0.04);
    gtk_main ();
    free (buffer);
    return 0;
}

程序非常简单,当我在那里创建/加载图像时它会显示一张图片,但是我想把已编程的函数放在那里,返回一个“缓冲区”,然后刷新显示的图像。 我读到gtk_widget_queue_draw有事可做,或gdk_pixbuf_simple_anim_add_frameg_timeout_add,但我不知道它们是如何工作的,以及在此计划中应该放什么。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果你想要一个动态图像或需要刷新的东西,那么我建议使用GtkDrawingArea并实现它的绘制信号,因为你需要使用cairo。看起来应该是这样的:

static gboolean
your_draw_cb(GtkWidget *widget, cairo_t *context, gpointer data)
{
  // Do your drawing
  return FALSE;
}

int main()
{
  // Some code before ...
  GtkWidget *area = gtk_drawing_area_new();
  g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(your_draw_cb), your_data);
  gtk_container_add(GTK_CONTAINER(your_container), area);
  // More code ...
}

每次要刷新时,都应该调用

gtk_widget_queue_draw(area);

获取调用的绘制信号。

您不需要存储缓冲区,因为它来自cairo上下文。

但您可能希望将其他库用于此目的,例如SDL2或OpenGL,因为它们是为视频游戏而设计的。

我希望这会有所帮助。