gxLib를 이용하시면 PNG파일을 사용할 수 있는데, PNG의 알파값을 변경하면 유명 메신저나 팝업으로 실행되는 영어 사전처럼 반투명한 그림을 화면에 출력할 수 있습니다. 예를 들어 jwCorkboard라는 프로그램처럼 말이죠. 은근히 광고죠? ^^

이렇게 화면에 반투명하게 출력할 수 있는 것은 PNG만 가능합니다. 물론 복사되는 목적 Device Context는 Screen이든 Bitmap이든 JPeg이든 관계없습니다. 다만 출력할 원본만 PNG이면 되는데, 이 이유는 픽셀에 대해 alpha 값을 가지고 있는 그래픽은 오직 PNG만 가지고 있기 때문입니다. 다시 말씀드려 PNG가 가지고 있는 alpha 값을 변경하면 같은 그림을 위와 같이 투명하게 출력할 수 있습니다.

본문 아래에 있는 예제 코드처럼 같은 PNG라도 alpha 값을 변경하여 출력하면, 그림에서처럼 투명도를 달리하여 화면에 출력할 수 있습니다.

예제 코드를 보시면 PNG의 각 픽셀에 대해 alpah값이 0 이상이 픽셀에 대해 alpha값을 변경했습니다. alpha값이 0 이상인 것을 확인하는 이유는 완전히 투명한 부분은 계속 투명을 유지하도록 하기 위함이죠. 그럼 예제 코드를 보시겠습니다.

#include    <stdio.h>
#include    <gx.h>
#include    <gxbmp.h>
#include    <gxpng.h>

int   main( void)
{
    dc_t    *dc_screen;                             // 화면 Device Context
    bmp_t   *bmp;
    png_t   *png;
    color_t  color;
    int      ndx_x, ndx_y;

    if  ( gx_init( "/dev/fb"))                      // gxLib 초기화
        gx_print_error( "");                        // 실행 중 에러 내용을 출력
    else
    {
        if  ( !( dc_screen = gx_get_screen_dc()))   // 화면 출력을 위한 스크린 DC 구함
            gx_print_error( "");                    // 실행 중 에러 내용을 출력
        else
        {
            if  ( !( bmp = gx_bmp_open( "16.bmp")))
                gx_print_error( "16.bmp");
            {
                if  ( !( png = gx_png_open( "pngout.png")))
                    gx_print_error( "pngout.png");
                {
                                        /*
                                         *  반투명하게 출력되는지 확인하기 위해
                                         *  미리 배경에 이미지를 출력
                                         */
                    // bmp를 화면에 출력
                    gx_bitblt( dc_screen, 0, 0, (dc_t *)bmp, 0, 0, bmp->width-1, bmp->height-1);

                                        /*
                                         *  이미지 그대로 출력
                                         */
                    // png를 화면에 출력
                    gx_bitblt( dc_screen, 0, 0, (dc_t *)png, 0, 0, png->width-1, png->height-1);

                                        /*
                                         *  알파값을 150으로 변경 후 출력
                                         */
                    // png의 알파 값을 150으로 변경
                    for ( ndx_y = 0; ndx_y < png->height; ndx_y++)
                    {
                        for ( ndx_x = 0; ndx_x < png->width; ndx_x++)
                        {
                            gx_get_pixel( ( dc_t *)png, ndx_x, ndx_y, &color);
                            if  ( 0 < color.alpha)
                                color.alpha = 150;
                            gx_set_pixel( ( dc_t *)png, ndx_x, ndx_y, color);
                        }
                    }
                    // 변경된 png를 화면에 출력
                    gx_bitblt( dc_screen, 100, png->height, (dc_t *)png, 0, 0, png->width-1, png->height-1);

                                        /*
                                         *  알파값을 50으로 변경 후 출력
                                         */
                    // png의 알파 값을 50으로 변경
                    for ( ndx_y = 0; ndx_y < png->height; ndx_y++)
                    {
                        for ( ndx_x = 0; ndx_x < png->width; ndx_x++)
                        {
                            gx_get_pixel( ( dc_t *)png, ndx_x, ndx_y, &color);
                            if  ( 0 < color.alpha)
                                color.alpha = 50;
                            gx_set_pixel( ( dc_t *)png, ndx_x, ndx_y, color);
                        }
                    }
                    // 변경된 png를 화면에 출력
                    gx_bitblt( dc_screen, 200, png->height *2, (dc_t *)png, 0, 0, png->width-1, png->height-1);

                    gx_png_close( png);
                }
                gx_bmp_close( bmp);
            }
            gx_release_dc( dc_screen);
        }
        gx_close();
    }
    return   0;
}