gxLib 내려받기            gxLib 0.6.9      213kb
gxLib설치 방법 및 함수 사용방법은 gxLib 게시판을 이용하여 주십시오.

이미지 작업을 하다 보면 여러 개의 이미지를 사용해야 하는데, 선택 버튼과 같이 같은 크기의 이미지를 여러 개 사용할 때가 있습니다. 이런 이미지를 하나하나 만들어서 일일이 읽어 들이는 것 보다는, 같은 크기 이니까 하나의 이미지 파일로 작성해서 한번에 불러 들이는 것이 편합니다. 예를 들어 아래와 같은 이미지를 준비했습니다.

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 *)를 매번 사용해야 하는 불편함이 있습니다.

사앵하는 방법은,

  1. gx_imagelist_create() 를 이용하여 이미지 목록을 만들고
  2. gx_imagelist_get() 를 이용하여 개별 이미지 포인터를 구하고 사용합니다.
  3. 작업이 완료되면 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;
}