【问题标题】:How to refresh a GTK image?如何刷新 GTK 图像?
【发布时间】:2018-03-04 22:00:55
【问题描述】:

大家好,来自 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 但我不知道它们是如何工作的以及在这个程序中放什么。 提前谢谢!

【问题讨论】:

    标签: c gtk opencl


    【解决方案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,因为它们是为视频游戏设计的。

    我希望这会有所帮助。

    【讨论】:

    • 另外说明,OpenCL 是用于一般编程,而不是用于图形
    • 谢谢,我会尝试使用GtkDrawingArea。为了制作图像,我必须处理其他图像,这个过程有点复杂,但它是针对每个像素单独完成的。并且处理器生成图像需要一段时间,因此我认为使用 opencl 来使用视频卡并使图像更快是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多