2013-10-22 4 views
1

CAIRO_FORMAT_A8cairo_surface_t이 있습니다. surfe를 그레이 스케일 이미지로 쓰고 싶으므로 모든 픽셀에 uchar 유형의 단일 바이트 값이 있습니다.그레이 스케일 카이로 표면을 PNG로 작성하는 방법

cairo_surface_write_to_pngCAIRO_FORMAT_A8 표면에 직접 쓰면 모두 흑백 이미지입니다. 카이로가 내부적으로 A8 표면을 알파 값으로 취급하는 방법이라고 생각합니다. 그레이 스케일 데이터가 아닙니다. 그러나 단일 그레이 스케일 이미지가 필요합니다.

누군가가 RGB24 이미지의 모든 3 레이어에 A8 형식을 복사하는 방법을 지적한다면 충분할 것입니다.

도움을 주셨습니다.

답변

1

아래의 테스트되지 않은 코드. 아이디어는 ARGB 표면을 생성하고 cairo_mask_surface()를 통해 A8 표면을 "복사"하는 것입니다. 색상이 "스왑 된"경우 두 개의 cairo_set_source_rgb() 호출을 서로 바꿉니다.

cairo_surface_t *s = YOUR_A8_SURFACE; 
cairo_t *cr = cairo_create(s); 
cairo_push_group_with_content(cr, CAIRO_CONTENT_COLOR_ALPHA); 
cairo_set_source_rgb(cr, 1, 1, 1); 
cairo_paint(cr); 
cairo_set_source_rgb(cr, 0, 0, 0); 
cairo_mask_surface(cr, cairo_get_target(cr), 0, 0); 
cairo_surface_write_to_png(cairo_get_group_target(cr), "/tmp/foo.png"); 
/* If you want to continue using the context: 
    cairo_pattern_destroy(cairo_pop_group(cr)); */ 
cairo_destroy(cr); 
`cairo_create` 표면을`해야하는 코드, 두 번째 줄 인수에 하나의 작은 오타
+0

, 수정 – Dyna

+0

감사를 s' –