E D R , A S I H C RSS

bitblt로 투명배경 구현하기

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를 만들어 봅시다.^^
~cpp 
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);
자~ 흑백 비트맵을 만들었습니다.^^
이제 마스크를 만들어 봅시다~!^^
~cpp 
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

이런 값이 저장됩니다.^^
이제 우리 이쁜 주인공뒤의 배경색을 검은색으로 바꾸어 줍시다.^^
~cpp 
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

이렇게 되겠습니다.^^
아 이뽀..~>ㅁ<;;
흠흠.. 진정하고, 이제는 배경도 처리를 해줘야 겠죠?
~cpp 
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로 합쳐 봅시다!~^^
~cpp 
BitBlt(hdc_background,0,0,size_x,size_y,hdc_original,0,0,SRCPAINT);
last.jpg

자. 모두 끝났어요~!
항상 마지막에는 쓰레기는 쓰레기통에~! 뒷정리는 깔끔히!!
~cpp 
DeleteDC(hdc_mask);
DeleteObject(bitmap_mask);
잊지 마세요.^^

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

그럼~~ㅎ

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

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

엮어가기

(beonit)레밍즈프로젝트/프로토타입에서 MFC기반으로 더블 버퍼링을 포함해서 간단하게 클래싱 해 보았습니다.
----
프로그래밍분류
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:36
Processing time 0.0401 sec