U E D R , A S I H C RSS

창섭/Bitmap Masking


1. 소개

  • MFC 의 경우다.
  • 우리가 비트맵을 불러다 쓸때 늘 사각형 모양으로 불러다 쓴다. 하지만 불러다 쓰고 싶은 모양이 사각형이 아니지만 본의 아니게 배경색까지 따라 찍힌다. 이 때 사용한다.
  • 비트맵 불러다 쓸때..(MFC에서) 마스크 써서 배경 처리하는걸 래스터 연산 생각하며 따지는게 귀찮아서 담엔 보고 하려고 만든다..;;

1.1. 원리1

  • 래스터 연산을 이용한다. 디지털 공학 시간에 배우는 OR, AND, XOR 등을 비트맵에서도 적용할 수 있다. 여기서는 XOR 은 쓰지 않아도 된다.
  • 보통 비트맵을 불러올 때 마지막에 이부분이 있다. (코드의 다른 설명은 추가하지 않겠음. 논의를 벗어나므로..)

~cpp 
	dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
여기서 SRCCOPY 라는 부분이 있는데 이게 래스터 연산자(Rastor OPeration) 이다. 종류는 다음과 같다.
SRCCOPY 그대로 복사
SRCPAINT OR 연산
SRCAND AND 연산
SRCINVERT XOR 연산
3비트 짜리 비트맵 코드(는 없겠지만...; )를 예로 든다면... 검은색은 000 이고 흰색은 111 이다. 그리고자 하는 비트맵이 101 이라면, 검은색과 원본을 AND 연산하면

~cpp 
000
101
---
000
이 되어 원본이 무시된다. 이것을 정리하면
원본과 상대할(?) 색 SRCAND(AND)의 결과 SRCPAINT(OR)의 결과
검은 색 검은 색 무변
흰색 무변 흰색
이렇게 된다. 다시 본론으로 돌아가서...우리가 하고 싶은 일은 그림의 배경을 잘라 내고 원하는 모양만을 밑그림에 붙이는 것이다. 따라서 우리는 배경은 무시되고 원하는 부분의 밑그림이 무시되어야 한다.

<원본 그림>
http://165.194.17.15/~wiz/data/zpwiki/originalbmp.bmp
<밑 그림>
http://165.194.17.15/~wiz/data/zpwiki/bgbmp.bmp
<원하는 결과>
http://165.194.17.15/~wiz/data/zpwiki/resultbmp.bmp


원본 그림에 흰색과 검은 색으로 그려진 그림(마스크)을 밑그림에 잘 연산시켜 순서를 잘 맞춰 그리면 원하는 그림이 나오는 것이다. 마스크는 밑의 두개중 아무거나 사용한다.

1.2. 원리2

  • 그림은 검은색을 만날 땐 OR 연산하고 흰색을 만날 땐 AND 연산하다~!! B)
  • 반면에 검은색을 만날 땐 AND 연산하고 흰색을 만날 땐 OR 연산하다... :(
  • 따라서 무시될 부분은 약하고 보일 부분은 강해지도록 배경색을 정하고 마스크를 정한다.
  • 우리는 그림이 이기고~! 그림 외의 부분은 밑그림이 이겨야 한다~!
    1. 밑그림을 먼저 깔아놓고...
    2. 그 위에 배경자리는 밑그림이 이기고 그림자리는 그림이 이기도록.. 마스크의 색깔을 정한다.
    3. 이제 다음과 같이 된다.

1.2.1. 마스크 1 사용

1.2.1.1. 순서

  1. 밑그림을 찍는다.
  2. 마스크를 SRCAND 연산 한다.
  3. 그림을 SRCPAINT 연산 한다.

1.2.2. 마스크 2 사용

1.2.2.1. 순서

  1. 밑그림을 찍는다.
  2. 마스크를 SRCPAINT 연산 한다.
  3. 그림을 SRCAND 연산 한다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:15
Processing time 0.0474 sec