CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

寻求淡入淡出图片的BCB源码!在线等待!

楼主zaqizaba(知其所以然)2002-04-18 10:03:10 在 C++ Builder / 基础类 提问

分数不够可以加! 问题点数: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

相关问题

  • 怎样使图象淡入淡出!
  • 高分:关于界面淡入淡出
  • 请教2d中淡入淡出
  • 请教DirectDraw特效 淡入淡出
  • 急啊!淡入淡出的问题!
  • direct draw 淡入淡出效果?
  • 窗口的淡入淡出,请指教.
  • delphi中如何对图象淡入淡出?
  • 怎样做一个淡入淡出的对话框?
  • 怎么实现文本的淡入淡出?

关键词

  • 函数
  • 控件
  • 属性
  • 像素
  • 模糊
  • 原理
  • 文件
  • 淡出
  • 淡入
  • softdowncolor

得分解答快速导航

  • 帖主:zaqizaba
  • mikesome

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo