2012-01-18 3 views
1

(고정 크기, 알파 채널 없음, < 60fps)의 원시 RGB 이미지 스트림을 GTK 창에 표시하고 싶습니다. 여기에서 카이로를 사용하려면 was told입니다.C, cairo : RGB 이미지의 렌더링 스트림

내 코드는 단일 이미지에서 잘 작동하며 약 1FPS의 이미지 스트림에도 사용할 수 있습니다. 2FPS 이상에서는 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

답변

1

이것은 관련이 없지만 기본 이미지를 업데이트하는 방법이 올바르지 않습니다. gtk_main에 대한 전화는 어디에서 받으나요? 또한 카메라에서 사용할 수있는 새 이미지에 대한 응답으로 expose-event를 생성하여 창을 업데이트합니다.

그런데, IMHO가 할 수없는 가장 좋은 방법 인 기본 창으로 직접 그려주는 것처럼 보입니다. 메인 윈도우에 GtkDrawingArea를 추가하고 expose-event 신호 (GTK2를 사용하는 경우) 또는 draw 신호 (GTK3를 사용하는 경우)에 응답하여 해당 신호를 그립니다.

또한 GSource을 사용하여 이벤트 소스와 같은 수신 이미지를 처리 ​​할 수 ​​있습니다.

+0

힌트를 보내 주셔서 감사합니다. 마침내 카이로 홈페이지에서 예제 코드를 찾아 내 필요에 맞게 변경했습니다 (http://cairographics.org/animationrotation). – lynix

관련 문제