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