그래픽 & 멀티미디어
글 수 15
2009.05.08 21:00:52 (*.55.127.122)
65140
이미지 작업을 하다 보면 여러 개의 이미지를 사용해야 하는데, 선택 버튼과 같이 같은 크기의 이미지를 여러 개 사용할 때가 있습니다. 이런 이미지를 하나하나 만들어서 일일이 읽어 들이는 것 보다는, 같은 크기 이니까 하나의 이미지 파일로 작성해서 한번에 불러 들이는 것이 편합니다. 예를 들어 아래와 같은 이미지를 준비했습니다.
gxLib에 새로 추가된 gx_imagelist_create() 함수를 이용하면 하나의 이미지에서 낱개로 쪼개서, 각각의 이미지를 사용할 수 있는 포인터를 구해줍니다. 각각 이미지 정보는 아래와 같은 구조로 되어 있습니다.
typedef struct image_list_t_ image_list_t; struct image_list_t_ { int count; png_t **array; };
주의 하실 점은 struct 구문을 보시면 아시겠습니다만 png 이미지만 사용하도록 했습니다. 파일 용량이 작고 투명 영역도 있어서 PNG를 선택했습니다만, 또 다른 이유는 Bitmap이나 Jpeg Image까지 처리하게 하려면 dc_t 포인터를 사용해야 하는데, dc_t를 사용하면, 이후로 이미지를 사용할 때 마다 ( bmp_t *) 나 ( jpg_t *)를 매번 사용해야 하는 불편함이 있습니다.
사앵하는 방법은,
- gx_imagelist_create() 를 이용하여 이미지 목록을 만들고
- gx_imagelist_get() 를 이용하여 개별 이미지 포인터를 구하고 사용합니다.
- 작업이 완료되면 gx_imagelist_close() 를 호출하여 사용한 자원을 시스템에 반환합니다.
샘플을 실행하면 위에 보여 드렸던 이미지 하나를 이용하여 바둑판 식으로 나누어 따로따로 아래와 같이 출력할 수 있습니다.
샘플 소스
#include <stdio.h> #include <unistd.h> #include <gx.h> #include <gxbdf.h> #include <gximagelist.h> int main( void) { dc_t *dc_screen; // 화면 Device Context png_t *png_back; // 백그라운드 출력을 위한 png png_t *png_cell; // 이미지 리스트를 이용할 png image_list_t *list; // 이미지 리스트 객체 핸들 int ndx; if ( gx_init( "/dev/fb")) // gxLib 초기화 gx_print_error( ""); // 실행 중 에러 내용을 출력 else { if ( !( dc_screen = gx_get_screen_dc())) // 화면 출력을 위한 스크린 DC 구함 gx_print_error( ""); // 실행 중 에러 내용을 출력 else { gx_clear( dc_screen, gx_color( 0, 0, 0, 255)); // 화면을 검정으로 if ( !( png_back = gx_png_open( "background.png"))) gx_print_error( "background.png"); else gx_bitblt( dc_screen, 0, 0, (dc_t *)png_back, 0, 0, png_back->width, png_back->height); // 이미지 리스트를 만들고 화면에 출력 if ( !( list = gx_imagelist_create( "sample.png", 90, 90))) gx_print_error( "gx_imagelist_create()"); else { printf( "이미지 개수 =%d\n", list->count); for ( ndx = 0; ndx < list->count; ndx++) { // 이미지 리스트에서 인덱스에 해당하는 이미지를 구함 png_cell = gx_imagelist_get( list, ndx); gx_bitblt( dc_screen, 50, 50, (dc_t *)png_cell, 0, 0, png_cell->width, png_cell->height); sleep(1); } gx_imagelist_close( list); } gx_release_dc( dc_screen); } gx_close(); } return 0; }