2012-01-18 93 views
1

我想在GTK窗口中显示原始RGB图像(固定大小,不带alpha通道,< 60fps)的流。我在这里使用cairo was toldC,cairo:呈现RGB图像流

我的代码可以很好地处理单个图像,并且仍然可以以大约1 FPS的速度处理图像流。 高于2 FPS我的应用程序崩溃与Xorg错误,所以我认为我的开罗机制是错误的。

它看起来有点像这样:

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(); 
} 

什么是呈现一系列图像,在开罗的正确方法? 哪些结构应该重新使用,哪些结构需要重新创建?

+0

提示:这是为UVC摄像头完成的:https://github.com/ufo-kit/libuca,以防万一您正在处理相机。 – drahnr 2014-03-21 09:56:46

回答

1

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

顺便说一句,它看起来像你直接画到主窗口,这不是恕我直言最好的事情。在主窗口中添加一个GtkDrawingArea,并在该信号(如果您使用GTK2)或draw信号(如果使用GTK3)作出响应时绘制该信号。

您还可以使用GSource处理传入图像,如事件源。

+0

感谢您的提示。我终于在cairo主页上找到了一些示例代码,并将其更改为符合我的需求(http://cairographics.org/animationrotation)。 – lynix 2012-01-25 20:11:13