2012-01-18 91 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