個(gè)性凸現(xiàn)的動(dòng)畫特技效果

字號(hào):

如果你使用過Photoshop這樣的圖像處理工具,一定曾為它們各式各樣的圖形處理方式興奮不已吧?不過話說回來,它也僅僅能處理單幅的靜止圖像。如果有一種方法能讓你在自己編寫的應(yīng)用程序中加入類似Photoshop中的圖像處理功能,而且是經(jīng)過改進(jìn)的動(dòng)態(tài)特技處理手段,你會(huì)覺得怎么樣呢?有興趣的話就請(qǐng)繼續(xù)往下看。
    在介紹這些特技處理方法之前,讓我們先做一些技術(shù)約定:用C++Builder開發(fā)工具編寫,應(yīng)用ScanLine處理技術(shù)(可極大提升圖像處理速度)。如果您用的不是C++Builder開發(fā)工具也沒關(guān)系,先看懂下面的處理方法后再將處理函數(shù)做一些修改,即可以應(yīng)用到您喜歡的開發(fā)工具中去。
    特技一、模糊淡出效果
    也許您對(duì)淡入淡出效果較為熟悉,但對(duì)一邊淡出一邊模糊的效果一定感到新鮮吧!
    首先分別談?wù)劦雠c模糊效果的原理。淡出函數(shù)的原理很簡(jiǎn)單,就是將每一像素點(diǎn)的R、G、B顏色值減去相同的整數(shù)直至零,這樣即可實(shí)現(xiàn)整幅圖的暗化。模糊函數(shù)相對(duì)要復(fù)雜一些,因?yàn)楸仨毧紤]周圍像素的影響,這就要引入加權(quán)算法,按照給定的系數(shù)對(duì)周圍像素點(diǎn)和當(dāng)前點(diǎn)的顏色值進(jìn)行加權(quán)運(yùn)算。
    下面讓我們參考范例。在C++Builder中創(chuàng)建新的工程(窗體保存為test.cpp),在Form中加入一個(gè)Image控件、一個(gè)Timer控件和一個(gè)Button控件。把Image控件的Autosize屬性改為 True,Visible屬性改為False,Align屬性改為alClient,把Timer控件的Enable屬性改為 False,Interval屬性改為10,把Button控件的Caption屬性改為“觀看淡出模糊效果并且退出”,其他的都采用默認(rèn)屬性。
    打開test.h頭文件,在其中加入淡出函數(shù)和模糊函數(shù)的聲明:
    void softdowncolor(TImage *Bp,int step); //淡出函數(shù)
    void softflt(TImage *Bp); //模糊函數(shù)
    其中,淡出函數(shù)softdowncolor的step參數(shù)是在淡出時(shí)
    減掉的顏色值,你可以通過它來控制淡出的速率。
    接著,在test.cpp文件中加入淡出函數(shù)和模糊函數(shù)的實(shí)現(xiàn):
    void softdowncolor(TImage *Bp,int step)
    { BYTE *ptr;
    int i,j;
    int color;
    Bp->Picture->Bitmap->PixelFormat=pf24bit;
    for(i=0;iHeight;i++){
    ptr=(BYTE *)Bp->Picture->Bitmap->ScanLine[i];
    for(j=0;jWidth*3;j+=3){
    color=ptr[j+2];
    color-=step;
    if(color<0)color=0;
    ptr[j+2]=color;
    color=ptr[j+1];
    color-=step;
    if(color<0)color=0;
    ptr[j+1]=color;
    color=ptr[j];
    color-=step;
    if(color<0)color=0;
    ptr[j]=color;
    }
    }
    }
    void softflt(TImage *Bp)
    { int Div=100;
    int temp[3];
    int flt[9]={10,10,10,10,20,10,10,10,10};
    BYTE *ptr,*ptru,*ptrm,*ptrd;
    int i,j,k,m;
    Bp->Picture->Bitmap->PixelFormat=pf24bit;
    for(k=1;k<(Bp->Picture->Bitmap->Height-1);k++){
    ptr=(BYTE *)Bp->Picture->Bitmap->ScanLine[k];
    ptrm=(BYTE *)Bp->Picture->Bitmap->ScanLine[k];
    ptru=(BYTE *)Bp->Picture->Bitmap->ScanLine[k-1];