[英]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.