C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[743] [Algorithm] Image의 Fade In-Out 효과
장성호 [nasilso] 9339 읽음    2008-02-20 11:06
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 을 조절하면 프로그램에 적당하게 맞추실 수 있을것 입니다.

그럼..
김태선 [cppbuilder]   2008-02-21 09:25 X
좋은 아이디어네요. @_@b

+ -

관련 글 리스트
743 [Algorithm] Image의 Fade In-Out 효과 장성호 9339 2008/02/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.