繁体   English   中英

C,开罗:渲染RGB图像流

[英]C, cairo: render stream of RGB images

我想在GTK窗口中显示原始RGB图像流 (固定大小,无alpha通道,<60fps)。 有人告诉这里使用开罗。

我的代码适用于单个图像,但仍可用于大约1 FPS的图像流。 高于2 FPS时,我的应用程序因Xorg错误而崩溃,因此我认为我的cairo机械师是错误的。

看起来像这样:

unsigned char    *image_data;
cairo_surface_t  *image;
GtkWidget        *main_window;

void init_window()
{
    // (...) all the GTK initialization stuff

    image_data = malloc(IMAGE_BYTES);
    image = cairo_image_surface_create_for_data(image_data,
                CAIRO_FORMAT_RGB24,
                IMAGE_W, IMAGE_H,
                cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, IMAGE_W));
}

void update_image()
{
    cairo_t *cr;

    cr = gdk_cairo_create(main_window->window);
    cairo_set_source_surface(cr, image, 10, 10);
    cairo_paint(cr);

    cairo_destroy(cr);
}

int main()
{
    // (...)
    init_window();

    while ((image_data = receive_image()) != NULL)
        update_image();
}

在开罗渲染一系列图像的正确方法是什么? 应该重用哪些结构,必须重新创建哪些结构?

这可能无关紧要,但是您更新主映像的方式不正确。 您打给gtk_main的电话在哪里? 此外,并响应于摄像机提供的新图像,生成暴露事件以更新窗口。

顺便说一句,看起来您正在直接绘制到主窗口,恕我直言,这不是最好的选择。 在主窗口中添加一个GtkDrawingArea,并根据expose-event信号(如果使用GTK2)或draw信号(如果使用GTK3)来draw GtkDrawingArea。

您还可以使用GSource将传入的图像像事件源一样处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM