TransparentBlt & AlphaBlend

TransparentBlt 함수

Transparent는 투명화이다.

즉, 투명화 함수(비트맵 출력과 동시에 함)

즉, BitBlt를 사용 안해도 된다는 것이다, 대처할 수 있다는 것이다.
그리고 배경(투명될 색)색도 정할 수 있다.


함수의 원형은 이런 구조이다.

TransparentBlt( 출력 담당 DC, 출력 위치 x, 출력 위치 y, 가로, 세로
                          ,출력물이 들어있는 DC, 출력물의 출력시작 위치x, 출력물의 출력시작 위치y, 가로, 세로
                          ,RGB(int, int, int) );

=>

출력담당 DC는 hdc를 뜻하며,
출력물 DC는 당연히 CreateCompatibleDC(hdc)를 부여받은 비트맵 전용
DC


ex) TransparentBlt(hdc,x,y,32,32,MemDC,0,0,32,32,RGB(0, 255, 0));   //마지막 RGB는 투명화될 색이다.


중요!!

이 함수 #pragma comment(lib,"msimg32.lib") 를 추가하여야한다.




TransparentBlt & AlphaBlend


API 로 게임을 만들기위해 공부하던중 이러한 문제에 직면하게 되었다.

 

캐릭터 리소스를 출력하는데 배경색을 투명하게 하고싶다.

 

그리고 캐릭터가 죽을경우 점점 투명화되면서 사라지게끔 하고싶다........ 이러한 기획을 구상해서 구현하려던중 두 함수를 알게되었다.

 

 


 

 

이러한 캐릭터 그림파일이 있다고 하자. 캐릭터부분을 제외하고는 분홍색으로 칠해져있다. (RGB(255, 0, 255)

 

내가 원하는것은 저 그림에서 분홍색을 투명으로 만들고 완성된 캐릭터에게도 투명값을 주려는것이다.

 

우선 분홍색값을 빼는 방법을 알아보자

 

 

TransparentBlt(hDest, nX, nY, m_Info.nFWidth, m_Info.nFHeight,

m_MemDC, nFrameX * m_Info.nFWidth, nFrameY * m_Info.nFHeightm_Info.nFWidth, m_Info.nFHeight, RGB(255, 0, 255));

 

hDest 는 배경에서 그려줄 부분이다. nX, nY 부터 m_Info.nFWidth, m_Info.nFHeight 까지의 사각형으로 범위를 지정해준다.

 

MemDC는 유닛의 메모리DC 이다. nFrameX * m_Info.nFWidth, nFrameY * m_Info.nFHeight, m_Info.nFWidth, m_Info.nFHeight 인자값들은 마찬가지로

 

MemDC에서 가져올 사각형의 범위를 지정해준다.

 

마지막 RGB(255, 0, 255) 인자값이 분홍색을 투명하게 해주는 컬러값이 되겠다. 만약 캐릭터의 바탕이 다른색이라면 포토샾 or 그림판에서 스포이드로 찍고

 

RGB 값을 참조해 적용하면 되겠다.

 

위와 같이 적용후 실행하게되면

 




 

이러한 캐릭터가 출력된다. 분홍색의 컬러값이 빠진걸 볼수있다.

 

보통은 여기까지 한뒤에 게임을 만들거나 하지만 추후 배경 컬러를 빼고 남은 캐릭터 또한 투명하게 해주고싶은 경우가 생길수있다.

 

이제 그 방법에 대해 알아보자 (약간 복잡하다)

 

이 방법을 사용하기위해서는 새로운 DC를 한개 더 선언해야한다. 나는 그것을 AlphaDC 라고 하였다..

 

 

1. AlphaDC <------------  배경             // 배경의 그림을 먼저 임시 알파DC에 저장한다.

 

2. AlphaDC <------------- 유닛            // 배경이 그려져있는 알파DC에 배경값을 뺀 유닛그림을 저장한다.

 

3. BackDC <-------------- AlphaDC     // 이 과정에서 투명값을 주면서 백버퍼에 저장한다.

 

 

 // 1. 알파블랜드 MemDC에 배경을 복사한다
 TransparentBlt(hAlpha, 0, 0, m_Info.nFWidth, m_Info.nFHeight,
  hDest, nX, nY, m_Info.nFWidth, m_Info.nFHeight, RGB(255, 0, 255));

 

 

 // 2. 알파블랜드 MemDC에 블랜드 대상을 복사한다
 TransparentBlt(hAlpha, 0, 0, m_Info.nFWidth, m_Info.nFHeight,
  m_MemDC, nFrameX * m_Info.nFWidth, nFrameY * m_Info.nFHeight, m_Info.nFWidth, m_Info.nFHeight, RGB(255, 0, 255));

 

 

 // 3. 백버퍼에 완성된 알파블랜드 MemDC를 보낸다

 BLENDFUNCTION bf;
 bf.BlendOp=AC_SRC_OVER; 
 bf.BlendFlags=0; 
 bf.SourceConstantAlpha=130; 
 bf.AlphaFormat=0;
 AlphaBlend(hDest, nX, nY, m_Info.nFWidth, m_Info.nFHeight,
  hAlpha, 0, 0, m_Info.nFWidth, m_Info.nFHeight, bf);

 

인자값같은경우에는 내가 짠 프로그램에서 사용하는 이름들이라 신경쓰지않아도 된다.

3번 과정에서 bf.SourceConstantAlpha = 130; 이게 바로 알파값을 주는것이다.

0이되면 완전한 투명이되는것이고 250정도의 숫자에 가까워질수록 본래색으로 출력된다.




출저:http://blog.naver.com/anjindago?Redirect=Log&logNo=126479717





원 동기인 성진이형이 쓴 글을 퍼왓다 호호호

[출처] TransparentBlt & AlphaBlend|작성자 격이

이 글을 공유하기

댓글

Designed by JB FACTORY