Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Bitblt로 투명배경 구현하기

From ZeroWiki

bitblt로 투명배경 구현하기

이름이야 멋지게 지었지만, 투명배경이라고 해도, 사실은 배경이 보이게 이미지를 겹쳐그린다는 뜻입니다.^^ 아무도 만들지 않은것 같아서..미숙하나마~만들어 보았어요.^^

두가지 그림을 합치면 좋을텐데, bitblt로 합치면 사각형으로 합치니까 동그라미라도 그리는 날엔, 동그라미의 배경이 뒤의 그림을 지워버려요.

그럼 어떻게 하면 될까요? 답부터 보여드리자면 이렇게~!

이그림과

zeropage:back02.jpg

이그림을

char02.jpg

OR연산 해버리면..

last_1.jpg

간단하죠~?

(OR연산이란! 0or0=0 0or1=1 1or0=1 1or1=1 이되는 연산입니다. 다시말해 0과 어떤값을 or연산하면 어떤값이 그대로 나오게 되죠.^^

            검은색은 000000000000000000000000이니까 (bit로 ㅎ 갯수가 맞나?)어떤색을 or연산해도 그색 그대로 나온답니다.^^)


자.. 그럼 지금부터 아래의 두 그림으로 연산을 시작해 봅시다~!^^ 두개의 그림의 DC가 준비되어 있어야 해요.^^

hdc_original

char01.jpg

hdc_background

back01_1.jpg

편의상 같은 크기의 그림을 준비했습니다.^^ 각각의 DC에 그림을 설정하는거 잊지마시구요.^^ 그림의 가로의 크기는 size_x 세로의 크기는 size_y의 상수로 하겟습니다.^^ 그리고 투명화될 색상은 RGB값 255,0,255입니다.^^

우선 앞으로 사용될 mask에 사용될 DC를 만들어 봅시다.^^

HDC hdc_mask; 
HBITMAP bitmap_mask;
hdc_mask= CreateCompatibleDC( hdc_background ); 
bitmap_mask=CreateBitmap(size_x, size_y, 1, 1, NULL); //mask로 사용할 흑백 비트맵을 생성합니다~!'ㅇ')/
SelectObject(hdc_mask,bitmap_mask);

자~ 흑백 비트맵을 만들었습니다.^^ 이제 마스크를 만들어 봅시다~!^^

SetBkColor(hdc_original, RGB(255,0,255) );
BitBlt(hdc_mask,0,0,size_x,size_y,hdc_original,0,0,SRCCOPY);

배경으로 사용될 색(RGB(255,0,255))이외에는 모두 검은색으로 만들어 주었습니다.^^ 배경으로 사용되는 색은 흰색이 되었구요.^^ 그러니까 결과는..

char_mark.jpg

이런 값이 저장됩니다.^^ 이제 우리 이쁜 주인공뒤의 배경색을 검은색으로 바꾸어 줍시다.^^

SetBkColor(hdc_original, RGB(0,0,0));
SetTextColor(hdc_original, RGB(255,255,255));
BitBlt(hdc_original,0,0,size_x,size_y,hdc_mask,0,0,SRCAND);

AND연산을 사용했어요.^^ (AND연산이란? 0and0=0 0and1=0 1and0=0 1and1=1 다시말해 0과 and연산을하면 무조건 0으로! 1과 and 연산을하면 대입한값 그대로 나오는,

             특정 부분만 골라내기 딱좋은 연산입니다.^^)

그래서 결과는..

char02.jpg

이렇게 되겠습니다.^^ 아 이뽀..~>ㅁ<;; 흠흠.. 진정하고, 이제는 배경도 처리를 해줘야 겠죠?

SetBkColor(hdc_background, RGB(255,255,255));
SetTextColor(hdc_background, RGB(0,0,0));
BitBlt(hdc_background,0,0,size_x,size_y,hdc_mask,0,0,SRCAND);

궁극의 AND연산.. 또 시전되었습니다.^^ 결과는..

back02_1.jpg

이렇게 될꺼예요.^^ 이제 마지막 연산! OR로 합쳐 봅시다!~^^

BitBlt(hdc_background,0,0,size_x,size_y,hdc_original,0,0,SRCPAINT);

last.jpg

자.^^ 모두 끝났어요~!^^ 항상 마지막에는 쓰레기는 쓰레기통에~! 뒷정리는 깔끔히!!

DeleteDC(hdc_mask);
DeleteObject(bitmap_mask);

잊지 마세요.^^

휴~ 초보라서 그런지 제대로 되었을지 모르겠네요..^^ 현제 사용중인 소스의걸 조금 변형해서 복사한터라.^^ 실수가 없으면 좋으련만.. 자자~ 틀린점 발견되면 즉시 수정해주세요.^^

그럼~~ㅎ


현재 필요한것은.. 프로그램을 컴파일해주는 컴파일러도 아니요.. 버그를 잡아주는 디버그도 아니다.. 귀차니즘을 한방에 날려줄 #include <부지런함> 이 가능한 전처리기.. 어디없나? 휴..

결국 마스크 비트맵을 메모리상에서 만들어서 한장 비트맵으로 투명 배경만들기하는 거 였네 ㅡ.ㅡ; 이런거 말고 좌우로 자동으로 바꿔서 그려주는 방법은 엄나;;;

엮어가기

(beonit)레밍즈프로젝트/프로토타입에서 MFC기반으로 더블 버퍼링을 포함해서 간단하게 클래싱 해 보았습니다.


프로그래밍분류