bitblt로 투명배경 구현하기 ¶
이름이야 멋지게 지었지만, 투명배경이라고 해도, 사실은 배경이 보이게 이미지를 겹쳐그린다는 뜻입니다.^^
아무도 만들지 않은것 같아서..미숙하나마~만들어 보았어요.^^
두가지 그림을 합치면 좋을텐데, bitblt로 합치면 사각형으로 합치니까 동그라미라도 그리는 날엔,
동그라미의 배경이 뒤의 그림을 지워버려요.
그럼 어떻게 하면 될까요? 답부터 보여드리자면 이렇게~!
이그림과
이그림을
OR연산 해버리면..
간단하죠~?
(OR연산이란! 0or0=0 0or1=1 1or0=1 1or1=1 이되는 연산입니다. 다시말해 0과 어떤값을 or연산하면 어떤값이 그대로 나오게 되죠.^^
자.. 그럼 지금부터 아래의 두 그림으로 연산을 시작해 봅시다~!^^
두개의 그림의 DC가 준비되어 있어야 해요.^^
hdc_original
hdc_background
편의상 같은 크기의 그림을 준비했습니다.^^
각각의 DC에 그림을 설정하는거 잊지마시구요.^^
그림의 가로의 크기는 size_x 세로의 크기는 size_y의 상수로 하겟습니다.^^
그리고 투명화될 색상은 RGB값 255,0,255입니다.^^
우선 앞으로 사용될 mask에 사용될 DC를 만들어 봅시다.^^
이제 마스크를 만들어 봅시다~!^^
배경으로 사용되는 색은 흰색이 되었구요.^^ 그러니까 결과는..
이런 값이 저장됩니다.^^
이제 우리 이쁜 주인공뒤의 배경색을 검은색으로 바꾸어 줍시다.^^
(AND연산이란? 0and0=0 0and1=0 1and0=0 1and1=1 다시말해 0과 and연산을하면 무조건 0으로! 1과 and 연산을하면 대입한값 그대로 나오는,
이렇게 되겠습니다.^^
아 이뽀..~>ㅁ<;;
흠흠.. 진정하고, 이제는 배경도 처리를 해줘야 겠죠?
결과는..
이렇게 될꺼예요.^^
이제 마지막 연산! OR로 합쳐 봅시다!~^^
자. 모두 끝났어요~!
항상 마지막에는 쓰레기는 쓰레기통에~! 뒷정리는 깔끔히!!
휴~ 초보라서 그런지 제대로 되었을지 모르겠네요..^^
현제 사용중인 소스의걸 조금 변형해서 복사한터라.^^ 실수가 없으면 좋으련만..
자자~ 틀린점 발견되면 즉시 수정해주세요.^^
그럼~~ㅎ
-----
현재 필요한것은..
프로그램을 컴파일해주는 컴파일러도 아니요..
버그를 잡아주는 디버그도 아니다..
귀차니즘을 한방에 날려줄 #include <부지런함> 이 가능한 전처리기.. 어디없나? 휴..
결국 마스크 비트맵을 메모리상에서 만들어서 한장 비트맵으로 투명 배경만들기하는 거 였네 ㅡ.ㅡ;
이런거 말고 좌우로 자동으로 바꿔서 그려주는 방법은 엄나;;;
아무도 만들지 않은것 같아서..미숙하나마~만들어 보았어요.^^
동그라미의 배경이 뒤의 그림을 지워버려요.
검은색은 000000000000000000000000이니까 (bit로 ㅎ 갯수가 맞나?)어떤색을 or연산해도 그색 그대로 나온답니다.^^)
두개의 그림의 DC가 준비되어 있어야 해요.^^
각각의 DC에 그림을 설정하는거 잊지마시구요.^^
그림의 가로의 크기는 size_x 세로의 크기는 size_y의 상수로 하겟습니다.^^
그리고 투명화될 색상은 RGB값 255,0,255입니다.^^
~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))이외에는 모두 검은색으로 만들어 주었습니다.^^
배경으로 사용되는 색은 흰색이 되었구요.^^ 그러니까 결과는..
이제 우리 이쁜 주인공뒤의 배경색을 검은색으로 바꾸어 줍시다.^^
~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 연산을하면 대입한값 그대로 나오는,
특정 부분만 골라내기 딱좋은 연산입니다.^^)
그래서 결과는..
아 이뽀..~>ㅁ<;;
흠흠.. 진정하고, 이제는 배경도 처리를 해줘야 겠죠?
~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연산.. 또 시전되었습니다.^^
결과는..
이제 마지막 연산! OR로 합쳐 봅시다!~^^
~cpp BitBlt(hdc_background,0,0,size_x,size_y,hdc_original,0,0,SRCPAINT);
항상 마지막에는 쓰레기는 쓰레기통에~! 뒷정리는 깔끔히!!
~cpp DeleteDC(hdc_mask); DeleteObject(bitmap_mask);잊지 마세요.^^
현제 사용중인 소스의걸 조금 변형해서 복사한터라.^^ 실수가 없으면 좋으련만..
자자~ 틀린점 발견되면 즉시 수정해주세요.^^
현재 필요한것은..
프로그램을 컴파일해주는 컴파일러도 아니요..
버그를 잡아주는 디버그도 아니다..
귀차니즘을 한방에 날려줄 #include <부지런함> 이 가능한 전처리기.. 어디없나? 휴..
이런거 말고 좌우로 자동으로 바꿔서 그려주는 방법은 엄나;;;