그래픽 & 멀티미디어
글 수 111
2008.12.12 09:59:21 (*.138.43.103)
33994
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 로 만들려고 구상중에 있습니다. ^^