C++Builder - 6图形、图像及实例(3)

2019-05-18 18:00

3实现图像的特殊显示效果

3.1知识要点

cn ok

的计算机系统,完成一个 for循环:

for(int i=0;i<10000;i++) { j=j+1;

}

可能也只是在一瞬间就完成了。而在实现图像的特殊显示效果时,需要在一个过程的完成后, 等待一定的时间,才运行程序下面的代码,这时就要使用到时间的延迟了。

Sleep函数只有一个整型参数 cMilliseconds,用来指定需要延迟的时间,它的单位是毫秒。例如 在程序中加入下面的代码:

1. Sleep函数

Sleep函数是系统的 API函数库里提供的时间延迟函数。延迟在程序设计中非常有意义。现在

ShowMessage(\现在开始计时\); Sleep(3000); //延迟三秒 ShowMessage(\延迟了三秒!\);

程序运行时在弹出“现在开始计时”的对话框后,程序在延迟了三秒钟的时间后,才弹出“延

2. rand()、random()、Randomize() 这三个随机函数是用来产生一个随机数。

int rand()函数,它返回一个不大于 RAND_MAX的随机数。RAND_MAX是能够产生的最大

迟了三秒!”对话框。

随机数。

int random(int num);它返回一个不大于 num的随机数。

其中 Number参数是可选的,是变量或任何有效的数值表达式。Randomize用 Number将 rand函数

Randomize(int Number);为产生一个随机数,应先执行 Randomize来初始化随机数生成器。

的随机数生成器初始化。如果省略 Number,则用系统计时器返回的值作为新的种子值。如果没有 使用 Randomize,则无参数的 Rand函数将使用第一次调用 Rand函数时的种子值。在使用随机函数

时,必须加入

int max=RAND_MAX;

Randomize();

int x=255*rand()/max; int y=random(100);

则 x的取值介于 0~255之间,y的取值介于 0~99之间。

3.2实例制作—— 图像淡入淡出效果

逐步均匀的增加图像各像素点的颜色值,直到恢复为原图。在这每一步中,都加入一定的时间延迟, 以实现程序中图像淡入的效果。图像淡出效果则与之相反,即逐步均匀的减少图像各像素点的颜色 值,直到图像各像素点的颜色值都变为黑色。

2.程序实现步骤

1.程序设计思路

图像淡入效果就是在一幅图像装载到 Image组件后,将图像各像素点的颜色值都置为黑色,再

(1)打开 C++Builder,生成一个新的应用程序。往窗体中加入的组件如表 4所示。

加入的组件 Form 表 4窗体中加入的组件及其属性 属性 属性值 Form1 2图像特殊显示效果 说明 Name Caption ※ 11※

et o

加入的组件

Image cn w. ww Name Name

ok bo 属性值 Image1 true OpenPictureDialog1 Button1 打开图像 Button2 图像淡入 Button3 图像淡出 Button4 说明

续表 4

根据装载的图像大小自 动调整 Image1的大小 属性 .n ok et

Name AutoSize OpenPictureDialog Button Button Button Button Caption Name Caption Name Caption Name Caption 马赛克显示 et Button Name Button5 Caption 设置好的程序界面如图

5所示。

透明显示 ok

ok cn

. cn ww

(2)在

Unit7_2.cpp开头部分,加入头文件和定义全局变量:.n 图 5设置好的程序界面

bo

#include #include

Graphics::TBitmap *bitmap1; Graphics::TBitmap *bitmap2; Byte *ptr,*newscan; int x,y;

(3)在生成窗体事件中初始化 bitmap1

、bitmap2,编写如下代码: void __fastcall TForm1::FormCreate (TObject *Sender) { bitmap1 = new Graphics::TBitmap ();

bitmap2 = new Graphics::TBitmap ();//生成 Tbitmap类的实例

}

(4

)编写单击 Button1的 OnClick事件,实现利用对话框,将图形文件加载到 Image1组件, 并取得 bitmap1的长度和宽度。编写如下代码:

void __fastcall TForm1::Button1Click(TObject *Sender)

{ String openname;

if(OpenPictureDialog1->Execute()) {

openname=OpenPictureDialog1->FileName;

Image1->Picture->LoadFromFile

(openname); bitmap1->LoadFromFilebitmap2->LoadFromFile

(openname);

(openname);

bitmap1->PixelFormat=pf24bit;

bitmap2->PixelFormat=pf24bit; x=bitmap1->Width;

※ 12※

o

.n

}

y=bitmap1->Height;

cn ok

}

20次均匀的变化,bitmap2 (5)编写单击 Button2的 OnClick事件,使得 bitmap1保持不变,经过

里的值由 0变为原始值。编写如下代码:

void __fastcall TForm1::Button2Click(TObject *Sender)

{

; bitmap2->Assign(Image1->Picture->Graphic)

bitmap1->Assign(Image1->Picture->Graphic); Byte r,g,b,bgr;

for(int i=0;i

{ newscan= static_cast(bitmap2->ScanLine[i]);

for(int j=0; j

{

newscan[j*3]=0;

newscan[j*3+1]=0;

newscan[j*3+2]=0;

} }

Image1->Picture->Bitmap->Assign(bitmap2); //设置整幅图为黑色

for(int l=0;l<20;l++) //L的取值代表着像素颜色变化的次数 {

for(int i=0;i

{

ptr=static_cast(bitmap1->ScanLine[i]); //bitmap1保持不变 newscan= static_cast(bitmap2->ScanLine[i]);

int j=0; j

{

b=ptr[j*3];

g=ptr[j*3+1];

r=ptr[j*3+2];

bgr=(b+g+r)/3; newscan[j*3]=l*b/20; newscan[j*3+1]=l*g/20;

newscan[j*3+2]=l*r/20; //bitmap2渐变、图像淡入

}

}

Image1->Picture->Bitmap->Assign(bitmap2); Form1->Refresh(); //窗体重画

); //Image1每一次变化后程序停顿 1秒钟,以便观测到图 Sleep(1000

像淡入的效果

}

Image1->Picture->Bitmap->Assign(bitmap1); //恢复原图

}

(6)编写单击的 Button3的 OnClick事件,使 bitmap1保持不变,经过 20次均匀的变化,bitmap2 里的值由原始值变为 0。编写如下代码:

void __fastcall TForm1::Button3Click(TObject *Sender)

{

bitmap2->Assign(Image1->Picture->Graphic);

bitmap1->Assign(Image1->Picture->Graphic);

Byte r,g,b; for(int l=0;l<20;l++)

{

for(int i=0;i

※ 13※

o

{

cn ok

ptr=static_cast(bitmap1->ScanLine[i]);

newscan= static_cast(bitmap2->ScanLine[i]);

for(int j=0; j

{

b=ptr[j*3];

g=ptr[j*3+1];

r=ptr[j*3+2];

newscan[j*3]=b-l*b/20; newscan[j*3+1]=g-l*g/20; newscan[j*3+2]=r-l*r/20; //bitmap2渐变、图像淡出 }

}

Image1->Picture->Bitmap->Assign(bitmap2); Form1->Refresh(); //窗体重画

Sleep(1000); //Image1每一次变化后程序停顿 1秒钟,以便观测到图 像淡出的效果}

for(int i=0;i

{

newscan= static_cast(bitmap2->ScanLine[i]);

for(int j=0; j

newscan[j*3]=0; newscan[j*3+1]=0; newscan[j*3+2]=0;

}

} //设置整幅图为黑色

Image1->Picture->Bitmap->Assign(bitmap2);

}

(7)保存文件,编译运行程序,3.3节还会继续用到这个工程文件。

3.程序分析与说明

使用 Sleep,要注意延迟时间参数 t的设定,使图像渐变的过程能够被清楚地观察到。

3.3实例制作——图像的马赛克现象

1.程序设计思路

图像的马赛克是指图像被分割成许多的小方块以随机的顺序显示出来直到恢复原图。 2.程序实现步骤

(1)打开 3.2节保存好的程序文件,编写 Button4的 OnClick事件,使图像所有的像素点全部 变黑。然后每次显示图像中一个位置随机的 50*50的方块,如此循环 500次。最后显示整个图像。

编写的代码如下:

void __fastcall TForm1::Button4Click(TObject *Sender) {

int x1,x2,y1,y2;

bitmap1->Assign(Image1->Picture->Graphic) ; for(int i=0;i

newscan= static_cast(bitmap2->ScanLine[i]);

for(int j=0; j

{

newscan[j*3]=0;

newscan[j*3+1]=0; newscan[j*3+2]=0;

※ 14※

o

}

cn ok

}

Image1->Picture->Bitmap->Assign(bitmap2);

Form1->Refresh();

int max=RAND_MAX; Randomize();

for(int l=0;l<500;l++)

{

x1=x*rand()/max; //产生随机方块的左顶点的横坐标

y1=y*rand()/max; //产生随机方块的左顶点的纵坐标

x2=x1+50;

y2=y1+50; if(x2>x) {

x1=x; }

if(y2>y) {

y2=y;

}

for(int i=y1;i

ptr= static_cast(bitmap1->ScanLine[i]);

newscan= static_cast(bitmap2->ScanLine[i]); for(int j=x1; j

newscan[j*3]=ptr[j*3];

newscan[j*3+1]=ptr[j*3+1];

newscan[j*3+2]=ptr[j*3+2]; //随机显示 50*50的一块图像

} }

Image1->Picture->Bitmap->Assign(bitmap2); Form1->Refresh(); //窗体重画 Sleep(100); }

Image1->Picture->Bitmap->Assign(bitmap1); //恢复原图

}

(2)保存文件,编译运行。 3.程序分析与说明

由于随机函数的随机性,每执行一次程序,图像变化的过程都不一样。

显示透明位图 3.4实例制作——

1.程序设计思路

位图透明显示,是指将图像显示在背景上时,指定某种颜色为透明色,图像上透明色不被显示

出来,而保持该处的背景颜色。在默认情况下,以位图最左下角像素的颜色为透明色。要实现透明 位图的显示,可以采用 2个 Timage组件叠放在同一位置,将背景图置于下方,进行图像合成。设 定要做透明显示的 Timage组件的 Transparent属性为 true,即为透明,并指定透明色,这种方法简 单有效,并且对背景图像的类型和格式不作要求。

2.程序实现步骤 加入如下代码:

(1)打开 3.3节所保存好的程序文件,编写 Button5的 OnClick事件,将 Image1图像透明显示, void __fastcall TForm1::Button5Click(TObject *Sender) {

※ 15※

o


C++Builder - 6图形、图像及实例(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:统计学 第五版 课后练答案 贾俊平

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: