이미지 투명 처리하는 방법은 여러가지가 있다.
일단 검색을 해본 결과
bmp 파일을 불러들여 TransparentBlt()함수로 배경을 없애준다거나 알파블렌딩함수를 이용하여 이미지에 투명도를 넣어준다거나 이다.
아니면 아예 투명처리가되어있는 PNG 파일을 불러도 되긴한다.
하지만 PNG는 DIB->DDB포맷으로 바꿔주는 함수가 gdiplus.h라는 헤더에 있는데 속도가 느리다는 단점을 가지고 있다.
결국, PNG 포맷 변환을 포기하고 배경투명화 되어있는 PNG파일을 포토샵으로 배경을 RGB(255, 0, 255)로 넣어주고 BMP 포맷 변환을 하기로.
TransparentBlt()
TransparentBlt 함수를 사용하려면, 보통 헤더를 포함하는 방식으로는 불가능하다.
프로젝트에서 TransparentBlt를 사용하기 위한 준비과정을 알아보자.
1. 프로젝트 파일에 오른쪽 마우스 클릭 후 속성(R) 을 선택한다.
2. 링커 -> 입력 -> 추가 종속성에, msimg32.lib 를 적어넣는다.
TransparentBlt는, msimg32.lib에 포함되어 있기 때문에, 사용하려면 이 파일을 프로젝트에 종속시켜야 사용할 수 있다
이제, TransparentBlt 함수를 사용해보자.
프로시저의 WM_PAINT 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 | hdc = BeginPaint ( g_hWnd, &ps ); MemDC = CreateCompatibleDC ( hdc ); bit = LoadBitmap ( g_hInst, MAKEINTRESOURCE(IDB_BITMAP1) ); obit = ( HBITMAP )SelectObject ( MemDC, bit ); TransparentBlt(hdc, 10, 10, 34, 34, MemDC, 34, 34, 34, 34, RGB(255, 0, 255 )); SelectObject ( MemDC, bit ); DeleteObject ( bit ); DeleteDC ( MemDC ); EndPaint ( g_hWnd, &ps ); |
BitBlt를 TransparentBlt로 바꾸었을 뿐, 아무것도 변하지 않았다.
TransparentBlt 함수를 해석하자면,
hdc의 10, 10 위치에, MemDC의 34, 34 위치로부터 34, 34 크기를 34, 34로 변환 후에 RGB(255, 0, 255) 색을 제외하고 복사한다.
라는 뜻이 된다.
/*******************************
TransparentBlt 함수의 프로토 타입
*******************************/
BOOL TransparentBlt(__in HDC hdcDest, __in int xoriginDest, __in int yoriginDest, __in int wDest, __in int hDest, in HDC hdcSrc, __in int xoriginSrc, __in int yoriginSrc, __in int wSrc, __in int hSrc, __in UINT crTransparent)
hdcDest의 ( xoriginDest, yoriginDest ) 위치에, hdcSrc의 ( xoriginSrc, yoriginSrc ) 위치부터 가로 wSrc, 세로 hSrc 만큼의 메모리를 가로 wDest, 세로 hDest 만큼의 크기로 변경 후에 crTransparent 에 해당하는 색을 제외하고 복사한다.
TransparentBlt 함수는 이미지의 크기 변경 또한 가능하지만, 메모리의 부담이 커기지 때문에 사용하지 않는것이 좋다.
선택한 색인 255, 0, 255 를 제외한 깨끗한 상태의 HERBALL이 출력되는것을 볼 수 있다.
AlphaBlend
알파 블렌드 함수를 사용하기 위해서는,
알파 채널이 있는 이미지 파일을 사용해야 한다.
HERBALL 파일의 알파채널의 모습이다.
배경색을 제외한 곳을 255 로 칠해주었다.
알파 채널을 사용한 비트맵 파일을 프로젝트로 불러들이고, AlphaBlend 함수를 사용해보자.
프로시저의 WM_PAINT의 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | hdc = BeginPaint ( g_hWnd, &ps ); BLENDFUNCTION bf; bf.AlphaFormat = AC_SRC_ALPHA; bf.BlendFlags = 0; bf.BlendOp = 0; bf.SourceConstantAlpha = 255; MemDC = CreateCompatibleDC ( hdc ); bit = LoadBitmap ( g_hInst, MAKEINTRESOURCE(IDB_BITMAP1) ); obit = ( HBITMAP )SelectObject ( MemDC, bit ); AlphaBlend(hdc, 10, 10, 34, 34, MemDC, 34, 34, 34, 34, bf); SelectObject ( MemDC, bit ); DeleteObject ( bit ); DeleteDC ( MemDC ); EndPaint ( g_hWnd, &ps ); |
BLENDFUNCTION 구조체는, AlphaBlend에서 쓰일 정보를 담고 있다.
보통 AlphaFormat과 SourceConstantAlpha 만 조정하여 사용한다.
SourceConstantAlpha는, 0 ~ 255 사이의 숫자로 사용 가능하며, 0은 완전한 투명, 255는 완전한 불투명으로 표시된다.
AlphaBlend 의 마지막 매개변수를 제외하면, 모두 TransparentBlt와 기능이 같다.
마지막 매개변수는 위에서 설명한 BLENDFUNCTION 구조체를 전달한다.
SourceConstantAlpha 수치를 128로 조정한 모습이다.
HERBALL이 약간 투명하게 변하여 배경색이 비치는것을 볼 수 있다.
출처 : http://metalkim.tistory.com/307