在介绍这些特技处理方法之前,让我们先做一些技术约定:用C++Builder开发工具编写,应用ScanLine处理技术(可极大提升图像处理速度)。如果您用的不是C++Builder开发工具也没关系,先看懂下面的处理方法后再将处理函数做一些修改,即可以应用到您喜欢的开发工具中去。
特技一、模糊淡出效果
也许您对淡入淡出效果较为熟悉,但对一边淡出一边模糊的效果一定感到新鲜吧!
首先分别谈谈淡出与模糊效果的原理。淡出函数的原理很简单,就是将每一像素点的R、G、B颜色值减去相同的整数直至零,这样即可实现整幅图的暗化。模糊函数相对要复杂一些,因为必须考虑周围像素的影响,这就要引入加权算法,按照给定的系数对周围像素点和当前点的颜色值进行加权运算。
下面让我们参考范例。在C++Builder中创建新的工程(窗体保存为test.cpp),在Form中加入一个Image控件、一个Timer控件和一个Button控件。把Image控件的Autosize属性改为 True,Visible属性改为False,Align属性改为alClient,把Timer控件的Enable属性改为 False,Interval属性改为10,把Button控件的Caption属性改为“观看淡出模糊效果并且退出”,其他的都采用默认属性。
打开test.h头文件,在其中加入淡出函数和模糊函数的声明:
void softdowncolor(TImage *Bp,int step); //淡出函数
void softflt(TImage *Bp); //模糊函数
其中,淡出函数softdowncolor的step参数是在淡出时
减掉的颜色值,你可以通过它来控制淡出的速率。
接着,在test.cpp文件中加入淡出函数和模糊函数的实现:
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];
ptrd=(BYTE *)Bp->Picture->Bitmap->ScanLine[k+1];
for(m=3;m<(Bp->Picture->Width-1)*3;m+=3){
temp[0]=0;
temp[1]=0;
temp[2]=0;
for(i=-1;i<=1;i++)
for(j=0;j<3;j++)
temp[j]+=ptrm[m+3*i+j]*flt[4+i];
for(i=-1;i<=1;i++)
for(j=0;j<3;j++)
temp[j]+=ptru[m+3*i+j]*flt[1+i];
for(i=-1;i<=1;i++)
for(j=0;j<3;j++)
temp[j]+=ptrd[m+3*i+j]*flt[7+i];
for(i=0;i<3;i++){
temp[i]=temp[i]/Div;
if(temp[i]>255)temp[i]=255;
if(temp[i]<0)temp[i]=0;
ptr[m+i]=temp[i];
}
}
}
}
现在让我们看看实际效果吧!在test.cpp中定义一全局变量:int BeEnd;
并且响应Form的创建事件:
void __fastcall TForm1::FormCreate(TObject *Sender)
{ Image1->Picture->LoadFromFile("1.bmp"); //加载的图像文件必须是Bmp格式
}
双击Button控件添加按钮响应事件:
void __fastcall TForm1::Button1Click(TObject *Sender)
{ BeEnd=0;
Timer1->Enabled=true;
}
双击Timer控件添加定时器响应事件:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
共2页 第1页 第2页






