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

Bitblt로 투명배경 구현하기: Difference between revisions

From ZeroWiki
imported>Unknown
No edit summary
 
(Repair batch-0008 pages from live compare)
 
Line 10: Line 10:
이그림과
이그림과


[[:File:zeropage:back02.jpg|zeropage:back02.jpg]]
zeropage:back02.jpg


이그림을
이그림을


[[:File:char02.jpg|char02.jpg]]
char02.jpg


OR연산 해버리면..
OR연산 해버리면..


[[:File:last_1.jpg|last_1.jpg]]
last_1.jpg


간단하죠~?
간단하죠~?
Line 31: Line 31:
hdc_original
hdc_original


[[:File:char01.jpg|char01.jpg]]
char01.jpg


hdc_background
hdc_background


[[:File:back01_1.jpg|back01_1.jpg]]
back01_1.jpg


편의상 같은 크기의 그림을 준비했습니다.^^
편의상 같은 크기의 그림을 준비했습니다.^^
Line 55: Line 55:
배경으로 사용되는 색은 흰색이 되었구요.^^ 그러니까 결과는..
배경으로 사용되는 색은 흰색이 되었구요.^^ 그러니까 결과는..


[[:File:char_mark.jpg|char_mark.jpg]]
char_mark.jpg


이런 값이 저장됩니다.^^
이런 값이 저장됩니다.^^
Line 67: Line 67:
그래서 결과는..
그래서 결과는..


[[:File:char02.jpg|char02.jpg]]
char02.jpg


이렇게 되겠습니다.^^
이렇게 되겠습니다.^^
Line 78: Line 78:
결과는..
결과는..


[[:File:back02_1.jpg|back02_1.jpg]]
back02_1.jpg


이렇게 될꺼예요.^^
이렇게 될꺼예요.^^
이제 마지막 연산! OR로 합쳐 봅시다!~^^
이제 마지막 연산! OR로 합쳐 봅시다!~^^
  BitBlt(hdc_background,0,0,size_x,size_y,hdc_original,0,0,SRCPAINT);
  BitBlt(hdc_background,0,0,size_x,size_y,hdc_original,0,0,SRCPAINT);
[[:File:last.jpg|last.jpg]]
last.jpg


자.^^ 모두 끝났어요~!^^
자.^^ 모두 끝났어요~!^^
Line 106: Line 106:
이런거 말고 좌우로 자동으로 바꿔서 그려주는 방법은 엄나;;;
이런거 말고 좌우로 자동으로 바꿔서 그려주는 방법은 엄나;;;
== 엮어가기 ==
== 엮어가기 ==
[[(beonit)레밍즈프로젝트/프로토타입]]에서 [[MFC]]기반으로 더블 버퍼링을 포함해서 간단하게 클래싱 해 보았습니다.
(beonit)레밍즈프로젝트/프로토타입에서 [[MFC]]기반으로 더블 버퍼링을 포함해서 간단하게 클래싱 해 보았습니다.
----
----
[[프로그래밍분류]]
[[프로그래밍분류]]

Latest revision as of 01:40, 27 March 2026

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기반으로 더블 버퍼링을 포함해서 간단하게 클래싱 해 보았습니다.


프로그래밍분류