Image의 Fade In-Out 효과에 관해 여기 볼랜드포럼에 올려져 있는 자료를 찾아보니 아래와 같은것이 있었습니다.
팁게시판에 올려져있지 않고 또 Builder유저가 쓰기에 불편한점도 있을것 같아 한번 정리해봅니다.
[볼랜드포럼에서 찾은 Fade효과 관련 자료]
Delphi - 박종민.BacTeria
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_tip&no=22
Delphi - civilian (civilian)
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=35799
C++ - 방태윤 (nabty)
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=11627
[Fade효과 원리]
원리는 간단합니다.
두개의 이미지가 있을때 fade효과는 두 이미지를 적당한 비율로 잘 썩어주면 됩니다.
그럼 어떻게 이미지를 합성하느냐가 관건인데..
보통 색상은 RGB값으로 되어있는데 두 old와 new 두 이미지에서 각 픽셀의 RGB 각각 썩어야 됩니다.
만약 30 : 70 으로 두 이미지(ImgA , ImgB ) 를 썩어야 한다면
Result = (ImgA * 30 + ImgB*70) / 100 이 되겠죠? ==> 핵심
이것은 픽셀의 RGB별로 각각 해주면 됩니다.
- 아래 예제를 TBitmap의 Size가 모두 같고 , Bitmap의 PixelFormat이 pf32bit 라는 가정하에 작성된것입니다.
[이미지 합성 함수]
void __fastcall ImageComposition(Graphics::TBitmap *OrgBmp,Graphics::TBitmap *NewBmp,Graphics::TBitmap *FadeBmp,int rate)
{
unsigned char *pt1,*pt2,*pt;
for(int h=0;hHeight;h++)
{
pt1=(unsigned char *)OrgBmp->ScanLine[h];
pt2=(unsigned char *)NewBmp->ScanLine[h];
pt=(unsigned char *)FadeBmp->ScanLine[h];
for(int w=0;wWidth;w++)
{
pt[0]=pt2[0]*rate/100+pt1[0]*(100-rate)/100; // B
pt[1]=pt2[1]*rate/100+pt1[1]*(100-rate)/100; // G
pt[2]=pt2[2]*rate/100+pt1[2]*(100-rate)/100; // R
pt[3]=pt2[3]*rate/100+pt1[3]*(100-rate)/100;
pt1+=4; //PixelFormat이 pf32bit 이므로 +4하여야 32bit 즉 한 pixcel이 옮겨짐
pt2+=4;
pt+=4;
}
}
}
//---------------------------------------------------------------------------
[사용예]
TImage Image1,Image2 가 있을때
위 함수를 이용하여 Image1을 Image2에 내용으로 fade효과를 주면서 바꾸려면 아래처럼 하면 됩니다.
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Graphics::TBitmap *OrgBmp,*NewBmp,*FadeBmp;
OrgBmp= Image1->Picture->Bitmap;
NewBmp= Image2->Picture->Bitmap;
FadeBmp=new Graphics::TBitmap;
FadeBmp->Width=OrgBmp->Width;
FadeBmp->Height=OrgBmp->Height;
FadeBmp->PixelFormat = pf32bit ;
int iInterval = 5 ; //5% 씩 변화를 준다.
for( int i=iInterval ; i<=100 ; i+=iInterval )
{
ImageComposition(OrgBmp,NewBmp,FadeBmp,i);
Image1->Picture->Bitmap->Assign(FadeBmp);
Application->ProcessMessages();
Sleep(50) // 이미지 변화 속도 50ms씩 간격으로 ...
}
delete FadeBmp;
}
//---------------------------------------------------------------------------
Sleep 과 for문에 iInterval 을 조절하면 프로그램에 적당하게 맞추실 수 있을것 입니다.
그럼..