본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 8 비트맵 및 이미지 처리 - 2

고급 이미지 출력 함수.
 
BitBlt나 StretchBlt 함수를 이용하면 단순하게 범위 지정, 출력만 가능하기때문에

고급! 이미지 출력함수가 필요하다.

뭐가 고급인지는 모르겠지만. 뭐 그냥 기능이 더 추가된 출력함수 라고 보면 될듯..

고급! 이미지 출력 함수로는 TransparentBlt와 AlphaBlend 가 있다. 



void CBmpOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CDC MemDC;
BITMAP bmpInfo;
MemDC.CreateCompatibleDC(&dc);

CBitmap bmp;
CBitmap* pOldBmp = NULL;
bmp.LoadBitmap(IDB_Test_Image);

bmp.GetBitmap(&bmpInfo);
pOldBmp = MemDC.SelectObject(&bmp);

dc.StretchBlt(20, 20,
bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
&MemDC,
0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY); //래스터 연산 값.

//※ 마지막 인자를 제외하면 StretchBlt() 함수와 거의 동일. 

 dc.TransparentBlt(20, 100,
bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
&MemDC,
0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
RGB(0, 0, 0));

 

MemDC.SelectObject(pOldBmp);
}

TransparentBlt 의 경우 배경의 투명색을 맞추어 그 색을 투명하게 바꾸어준다.

예제로 들어간 파일의 원래 배경은 검은색 이지만 여기서 RGB값을 통하여 검은색으로 맞추어주었기 때문에.

검은색이 투명화 되어 흰색으로 출력되게 된다.

해당 출력화면은 다음과 같다.


 
다음으로는

 
AlphaBlend 함수다.  



void CBmpOutDemoView::OnPaint()
{
CPaintDC dc(this); // device context for painting

CDC MemDC;
BITMAP bmpInfo;
MemDC.CreateCompatibleDC(&dc);

CBitmap bmp;
CBitmap* pOldBmp = NULL;
bmp.LoadBitmap(IDB_Test_Image);

bmp.GetBitmap(&bmpInfo);
pOldBmp = MemDC.SelectObject(&bmp);

dc.StretchBlt(20, 20,
bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
&MemDC,
0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY); //래스터 연산 값.

//※ 마지막 인자를 제외하면 StretchBlt() 함수와 거의 동일. 
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 50; //0: 투명 255: 불투명
bf.AlphaFormat = 0;
//반투명 이미지를 출력한다.

dc.AlphaBlend(20, 100,
bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2,
&MemDC,
0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
bf);

MemDC.SelectObject(pOldBmp);

}



마지막 인자로 반투명 이미지를 출력하게 하는 점이 다른 함수들의 마지막 인자와 다르다.

또한 이를 위해 구조체를 정해주어야 한다는 점이 포인트.

다른 인자는 여타 출력 함수들과 같은 역할을 한다.

 AlphaBlend에서 쓰이는 마지막 인자인 BLENDFUCTION 구조체의 원형에 대하여 좀더 상세히 알아보면.

    [쉽게 원형을 알아보려면 해당 구조체를 정하거나 함수 호출 하는 문구에 우클릭을 해서 정의로 이동 메뉴클릭하면 된다.]



typedef struct _BLENDFUNCTION { BYTE BlendOp; BYTE BlendFlags; BYTE SourceConstantAlpha; BYTE AlphaFormat; }BLENDFUNCTION,*PBLENDFUNCTION;



 
 옵션 설명, 
BlendOp 멤버는 원본 이미지와 대상 이미지를 섞는 연산을 명시,기본값은 AC_SRC_OVER 가 되며 현재까지는 이 옵션 이외의 다른 값이 생기지는 않았음.

BlendFlags 는 사용하지 않으며 반드시 0 이어야 함.[이럴거면 왜만든겨]

 SourceConstantAlpha 멤버는 원본 이미지의 투명도를 결정하며 그 값의 범위는 0~255.
0이면 완전히 투명해지므로 아무것도 출력하지 않은 상태가 되어버리고 255를 하면 투명도가 없는 출력이 이루어짐.

 
마지막  AlphaFormat은 원본과 대상 비트맵 이미지를 해석하는 방법을 명시함, 이 값은 0 이거나 AC_SRC_ALPHA가 되어야 하며 AC_SRC_ALPHA 이 되는 경우는 원본 비트맵이 24비트 이하의 비트맵이 아닌 각 픽셀에 대한 알파 채널을 갖는 진정한 32 비트맵인 경우에만 해당함.

이 경우 복잡한 연산 대신 알파 채널을 이용한 별도의 연산으로 이미지를 혼합하여 이미지의 전체 투명도를 조절한 출력이 아닌 각 픽셀에 따른 개개의 투명도가 적용되는 출력이 가능함.

32비트로 이루어진 메모장 아이콘의 확대샷.



 이번 코드는 완성된 코드로 나와있어서[본문 보고 따라하기가 파일이 없기에 불가능.]

예제 원문 코드를 그대로 업로드 함.[한두줄의 주석 추가]