그래픽 & 멀티미디어
글 수 111
2008.12.12 09:59:21 (*.138.43.103)
35575
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;
}



요걸 빨리 프로젝트에 사용해야 겠어요
갠적으로 스피드메뉴를 gxLib 로 만들려고 구상중에 있습니다. ^^