寻求淡入淡出图片的BCB源码!在线等待!
分数不够可以加! 问题点数:50、回复次数:9Top
1 楼zaqizaba(知其所以然)回复于 2002-04-18 10:52:15 得分 0
等啊等啊等....Top
2 楼zaqizaba(知其所以然)回复于 2002-04-18 11:35:21 得分 0
有人吗~~~~Top
3 楼eren02(东风)回复于 2002-04-18 12:37:44 得分 0
等我会了告诉你!再等一个月吧!Top
4 楼mikesome()回复于 2002-04-18 12:40:46 得分 50
首先分别谈谈淡出与模糊效果的原理。淡出函数的原理很简单,就是将每一像素点的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)
{ BeEnd++;
softflt(Image1);
softdowncolor(Image1,20);
this->Canvas->CopyRect(Rect(0,0,Image1->Picture->Width, Image1->Picture->Height),Image1->Canvas,Rect(0,0,Image1->Picture->Width, Image1->Picture->Height));
if(BeEnd>=12){
Timer1->Enabled=false;
Close();
}
}
编译运行程序
Top
5 楼zaqizaba(知其所以然)回复于 2002-04-18 13:43:03 得分 0
那淡入呢Top
6 楼magicsnake(北极狐)回复于 2002-04-18 14:35:35 得分 0
关注Top
7 楼zaqizaba(知其所以然)回复于 2002-04-18 14:38:14 得分 0
有人吗Top
8 楼mikesome()回复于 2002-04-18 14:47:27 得分 0
如果你淡出的时候不需要模糊
那样的话
void softdowncolor(TImage *Bp,int step); //淡出函数 就够了
淡入则和这个函数相反
淡出函数的原理很简单,就是将每一像素点的R、G、B颜色值减去相同的整数直至零,这样即可实现整幅图的暗化。
淡入则相反,就是将每一像素点的R、G、B颜色值加上相同的整数直至达到原来R,G,B值,该点的增加就停止,这样即可实现整幅图的淡入。
仔细把淡出的函数看懂,淡入不要太简单哦,呵呵Top
9 楼zaqizaba(知其所以然)回复于 2002-04-18 14:51:11 得分 0
太感谢了!Top




