【问题标题】:C, cairo: render stream of RGB imagesC、cairo:RGB图像的渲染流
【发布时间】:2012-02-13 08:08:19
【问题描述】:

我想在 GTK 窗口中显示原始 RGB 图像流(固定大小,无 Alpha 通道,was told在这里使用cairo。

我的代码适用于单个图像,并且仍然适用于大约 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();
}

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

【问题讨论】:

标签: c image gtk rgb cairo


【解决方案1】:

这可能是无关的,但是您在主中更新图像的方式不正确。你在哪里给gtk_main打电话?此外,为了响应相机提供的新图像,生成一个曝光事件来更新您的窗口。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2017-11-15
  • 1970-01-01
  • 2011-10-16
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多