|
Graphics32 라이브러리를 사용하신다면...
먼저 폼 위에 Image32 를 하나 떨궈 놓으시고
배경으로 쓸 이미지를 로드 합니다. (Image32란 이름으로 만들어졌다고 칩시다)
Image32->Bitmap->LoadFromFile("배경화일명"); 하시든지 리소스에서 읽으시든지.. 하죠
그리고 나서 Layer 를 하나 올리면 되겠죠
TBitmapLayer *bmplayer; 같은걸 폼 클래스의 헤더에 선언하시고
bmplayer = new TBitmapLayer(Image32->Layers); 이렇게 하시면, 레이어가 Image32 위에 한장 올라가죠
bmplayer->Bitmap->LoadFromFile("프레임화일명"); 하셔서 레이어에 이미지를 부르시고
TFloatRect L;
L.Left = 0;
L.Top = 0;
L.Right = bmplayer->Bitmap->Width;
L.Bottom = bmplayer->Bitmap->Height;
bmplayer->Location = L; 하셔서 레이어의 이미지가 실제 크기대로 나타나게 할 수 있습니다.
(Location 에 정의된 크기로 이미지가 Stretch 되거든요)
프레임이미지가 알파값을 가진 이미지라면,
bmplayer->DrawMode = dmBlend; 하시면 그 알파값이 그대로 화면에 반영됩니다.
만약 알파값이 있는 이미지를 사용하기 위해 PNG화일 포멧 같은걸 사용하시고 싶으시면
자료실에 있는 GraphicEx 라이브러리를 추가로 깔아주시면 되죠.
Graphics32 라이브러리를 사용하지 않으신다면, 앞서 다른분이 설명해 주신대로 하시면 되죠
이 때, 이미지를 32bit 이미지로 관리를 하시는게 편하겠죠. 첫 byte 가 alpha 값이니까요
그렇게 하시지 않으신다면 별도로 마스크를 위한 이미지 버퍼를 두셔야 할테구요.
메모리에서 배경, 프레임 이렇게 두 개의 이미지를 두시고...
그게 화면에 그려질 땐 블랜딩해서 그려주는 함수를 하나 두시면 되겠죠.
int mr = (배경의 빨강 & 알파값(배경은 기본적으로 알파값이 255겠죠? 그렇다면 무시해도 되죠)) +
(전경의 빨강 & 알파값);
int mg = (배경의 녹색 ......;
int mb = (배경의 파랑 ......;
처럼 하셔서
if (mr > 255) mr = 255;
if (mg > .....;
if (mb > .....;
로 믹스된 점의색이 흰색을 초과해 뒤집어지는걸 막아 주신 다음
RGB(mr, mg, mb) 하시면 블랜딩 된 점의 색이 나오겠죠.
RGB는 매크로 함수인데 ((mr << 16) | (mg << 8) | mb) 하셔도 됩니다.
이런식으로 두 개의 이미지의 모든 점을 루프돌려 블랜딩하신 후 화면에 그려주면 되겠죠.
|