ok
.
et
内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用
方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。本文还介绍了图
像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像
处理,几乎都离不开 ScanLine 技术。使用 ScanLine 技术,能够快速取得 bitmap 的每行的颜色值,
而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。
关键字:C++Builder、图形、图像、画布
引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。
然 而 对 于 初 学 者 来 说 , 庞 大 复 杂 的 GDI 绘 图 系 统 是 一 个 难 以 跨 越 的 学 习 障 碍 。 所 幸 的 是 , 在
C++Builder 绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现
Windows 下的绘图功能。C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处
理。
正文:
1 在窗体上作图
1.1 知识要点
1. 画布( Canvas)
在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含
Canvas 属性。Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包
含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。
(1)Canvas 类主要属性有:
Font:画布绘制文本所用的字体。
Brush:用于填充背景的画笔刷。
Pen:用来画线和描述图形轮廓的画笔。
PenPos:当前绘图位置的坐标。
Pixels:画布像素数组。
(2)Canvas 类主要方法有:
Arc:用当前画笔在画布上画圆弧。
Chord:绘制由直线和椭圆相交而成的一个封闭形状。
CopyRect:将图形的一部分从另一个画布复制过来。
Ellipse:在给定的区域绘制椭圆。
FillRect:用当前画刷填充指定的矩形。
FloodFill:用当前画刷填充指定的区域。
(3)LineTo 类主要方法有:
MoveTo:连同 LineTo 绘制直线。
Polygon:绘出一系列的线,串起所传入的各个点,并从最后一点到第一点绘制一条线。
Polyline:绘出一系列的线,串起所传入的各个点。
Rectangle:绘制圆角矩形。
StretchDraw:在画布上给定的大小绘制图像。
TextOut:在画布上写出字符串。
TextRect:在限定的区域写出字符串,区域之外的字符串不会被显示出来。
2. 颜色常数
在 C++Builder 中提供了许多颜色的预定常数,这些预设颜色都以 cl(cl 代表 color)为启始字
※ 1 ※
o
C++Builder 图形、图像及实例w
ok
cn
符命名。例如 clRed 代表红色,clBlue 代表蓝色,clGreen 代表绿色等等。另外 C++Builder 也将 Windows
的基本颜色以常数定义,如 clWindow 及 clMenu 分别代表 Window 及 Menu(菜单)的颜色。
下面列出部分 C++Builder 定义的颜色常数:
clBlack:黑色。
clGreen:绿色。
clOlive:橄榄绿。
clNavy:海蓝色。
clPurple:紫色。
clTeal:青紫色。
clGray:灰色。
clSilver:银色。
clRed:红色。
clLime:灰绿色。
clBlue:蓝色。
clAqua:淡绿青色。
clWhite:白色。
clBackground:Window 背景色。
clActiveCaption:活动视窗的标
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
色。
clInactiveCaption:非活动视窗的标题色。
clMenu:Menu 的颜色。
clWindow:Windows 的背景色。
clMenuText:Menu 文字的颜色。
clWindowText:Window 内文字的颜色。
clCaptionText:标题文字的颜色。
clActiveBorder:活动视窗的边界颜色。
clHighlight:高亮度 Windows 颜色。
clHightlightText:被选取文字的颜色。
clGrayText:灰色文字的颜色。
clBtnText:Button 内文字的颜色。
以下的程序表示将画布中(3,5)这一像素点的颜色设为蓝色:
Canvas -> Pixels [3][5]=clBlue;
另外,也可以利用以下的叙述来设定画笔的颜色为蓝色:
Canvas->Pen->Color=RGB(0,0,255);
3. RGB 函数
任何一种颜色都是由红、绿、蓝三种基本色构成的。RGB 函数是 Windows 系统用以表示颜色
的方式,它们用三个字节型参数变量,分别代表红色(Red)、绿色(Green)及蓝色(Blue)的强度
值(0~255 之间),组合起来表示颜色。例如 RGB(255,0,0)代表红色(RGB(255,0,0)所代表的
颜色和颜色常数 clRed 是相同的)。
如果 RGB 函数中的三个参数相同,即红、绿、蓝的强度值一样,则其代表的颜色是黑白的。
例如 RGB(255,255,255)代表白色,RGB(0,0,0)代表黑色。
4. Tcolor 类
Tcolor 是表示颜色的类,其实例可以是 clRed、clBlue、clGreen 等刚才介绍到的颜色常数,例
如:
Tcolor color=clRed;
也可以使用 RGB 函数来取值,例如:
※ 2 ※
o
ok
cn
Tcolor color= RGB(4, 34, 253);
5. Pen 和 Brush
Tpen 是在 Canvas 画线所使用的“笔”,因此所有和线条有关的绘图函数都会受 Tpen 影响,如
LineTo、Ellipse、Polygon、PolyLine、Rectangle 等函数都使用“笔”来画线,可以利用 Canvas.Pen
来存取 Pen,并且可以修改 Pen 的性质,这些性质包含 Color、Width、Style,以及 Mode 等。Style
属性用来设置画笔样式:
Pen->Style=psSolid,表示画笔是实心; =psDash 表示破折线; =psDot 表示点线; =psDashDot
表示破折线+点线;=psClear 表示透明线。
Width 属性用来设置画笔的宽度,Pen->Width=5 表示画笔的宽度为 5 个像素。
Color 属性用来设定画笔的颜色。例如:Canvas->Pen->Color=clBlue;则表示将画笔的颜色设为
蓝色。Tbrush 可用来在 Canvas 的特定区域下着色。和 Tpen 不同的是,Tbrush 可以用不同的颜色、
样式及图案来填满 Canvas 的特定区域,而 Tpen 则是用来在 Canvas 上画线。
Tbrush 的 Style 属性有 bsHorizontal、bsVertical、bsFDiagonal、bsBDiagonal、bsCross、bsDiagCross
几种,分别代表实心、透明、水平线、垂直线、左上到右下的斜线,左下到右上的斜线、垂直交叉
线、对角交叉线这几种填充
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。
其中 bsClear 为默认值。
Tbrush 的 Color 属性设定与 Pen 的 Color 属性相一致。
6. 常用的绘图函数
1)Canvas->MoveTo(int X, int Y);
函数用法:
MoveTo 是用以在使用 LineTo 之前设定画笔位置。使用此函数和直接设定 Canvas 的 PenPos 属
性的效果相同。
2)Canvas->LineTo(int X, int Y);
函数用法:
LineTo 函数用来从画笔位置画一条至(X,Y)点的直线,此直线不包含(X,Y)点,同时将
画笔位置移至(X,Y)。所画的直线形状与 Pen 的属性一致。
3)Canvas->Ellipse(int X1,int Y1,int X2,int Y2);
函数用法:
利用 Ellipse 可在 Canvas 上画出圆形或椭圆形。其环绕矩形的左上角坐标为(X1,Y1)而右下
角坐标为(X2,Y2)。若该矩形为正方形,则所绘图形为圆形。当此椭圆形绘制时,使用 Pen 的值
画出其外框,而使用 Brush 值填满其内部。
4)Canvas->Rectangle(int X1, int Y1, int X2,int Y2);
函数用法:
在 Canvas 上画出一矩形。其矩形的左上角坐标为(X1,Y1),而右下角坐标为(X2,Y2),矩
形内部的填充效果根据画刷的类型确定。
5)Canvas->Refresh()
函数用法:
清除画布。
1.2 实例制作—— 用鼠标随意作图
1. 程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
思路
所谓在窗体上任意作图,就是要用鼠标在窗体上弹起弹落来确定所要画图形的起始位置,并设
定好 Pen 和 Brush 的各种属性,可在窗体上绘制直线、矩形、椭圆等图形。
2. 程序实现步骤
(1)打开 C++Builder,生成一个新的应用程序,在
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
中加入的组件如表 1 所示。
※ 3 ※
o
ww
w.
cn
表 1
ok
工程中加入的组件及其属性
ok
.n
et
.
bo
w.
.n
bo
设置好的程序界面如图 1 所示。
w
.c
o
图 1
※
ok
程序界面
4 ※
et
o
.n
ww
et
et
ok
cn
w
et
ok
.c
ok
cn
(2)定义全局变量:
int sort,ox,oy; //sort 代表要绘制图形的类别,ox、oy 表示鼠标按下去时的坐标位置
(3)在生成窗体事件中初始化 sort,编写代码如下:
void __fastcall TForm1:: FormCreate(TObject *Sender)
{
sort=0; //表示不绘制图形
}
(4)设定画笔的宽度、颜色、形状。
编写代码如下:
void __fastcall TForm1::Button6Click(TObject *Sender)
{
if(ColorDialog1->Execute())
{
TColor pencolor;
Canvas->Pen->Color=ColorDialog1->Color; //设定画笔颜色
}
}
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
Canvas->Pen->Style=psSolid ; //设定画笔为实线
}
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
Canvas->Pen->Style=psDash ; //设定画笔为破折线
}
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
Canvas->Pen->Style=psDot; //设定画笔为点线
}
void __fastcall TForm1::RadioButton4Click(TObject *Sender)
{
Canvas->Pen->Style=psDashDot ; //设定画笔为点线+破折线
}
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Canvas->Pen->Width=StrToInt(Edit1->Text); //设定线宽
}
(5)设定画刷的颜色、形状,编写代码如下:
void __fastcall TForm1::Button7Click(TObject *Sender)
{
if(ColorDialog1->Execute())
{
TColor pencolor;
Canvas->Brush->Color=ColorDialog1->Color; //设定画刷的颜色
}
}
void __fastcall TForm1::RadioButton5Click(TObject *Sender)
{
Canvas->Brush->Style=bsSolid; //设定画刷为实心
※ 5 ※
o
ok
cn
}
void __fastcall TForm1::RadioButton6Click(TObject *Sender)
{
Canvas->Brush->Style=bsClear; //设定画刷为透明
}
void __fastcall TForm1::RadioButton7Click(TObject *Sender)
{
Canvas->Brush->Style= bsHorizontal; //设定画刷为水平填充
}
void __fastcall TForm1::RadioButton8Click(TObject *Sender)
{
Canvas->Brush->Style= bsVertical; //设定画刷为垂直填充
}
(6)确定下一步是画椭圆、画直线、画矩形、清屏还是终止绘图,编写如下的代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sort=0;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
sort=1;
}
void __fastcall TForm1::Button4Click(TObject *Sender)
{
sort=2;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
sort=3;
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Canvas -> Refresh();
}
(7)
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
下鼠标在窗体上按下的坐标,即确定所要画图形的起始位置,编写如下的代码:
void __fastcall TForm1::FormMouseDown( TObject *Sender, TMouseButton Button,TShiftState
Shift, int X, int Y)
{
ox=X;
oy=Y;
}
(8)编写鼠标在弹起时程序所要做的工作,编写如下的代码:
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift,
int X, int Y)
{
switch(sort)
{
case 1 :
Canvas->MoveTo(ox, oy);
Canvas->LineTo(X, Y);
※ 6 ※
o
ok
cn
break;
case 2 :
Canvas -> Rectangle(ox,oy,X, Y);
break;
case 3:
Canvas -> Ellipse(ox,oy,X, Y);
break;
}
}
(9)程序编译运行,可在窗体上随意画出各种图形组合,如图 2 所示。
ww
.n
.n bo
图 2 程序运行结果图
3. 程序分析与说明
本例所画的图形在窗体重新调整大小时都自动消失,这是因为程序没有在 FormPaint 事件中绘
图。在 FormPaint 事件中绘制的图形不会在窗体调整时自动消失。
2 彩色图变黑白图
2.1 知识要点
1. Image 组件
Image 组件用来装载图像文件和在程序中显示图像。Image 组件位于 Additional 组,该组件在模
板中的位置如图 3 所示(图中提示信息上方的按钮)。
图 3et 组件 ok
Image 的属性包括 Canvas(画布),用法如同 1 节知识要点所介绍。此外,它还有别的常用属性,
如表 2 所示。
表 2 Image 组件的常用属性
ww
Image 的函数:
w
ww
※
7
※
o
ok
.n
et
w
ww
.c
Image
ok
cn
LoadFromFile(String filename);
函数用法:
LoadFromFile 是将图形文件加载到 Image 组件中。
例如要将 C 盘 image 文件夹中名为 image1.bmp 的图形文件加入到 Image1 组件,可在程序中加
入如下代码:
Image1->Picture-> LoadFromFile("C:\\image\\image1.bmp");
2. GetRValue、GetBValue 和 GetGValue
这三个 API 函数是用来在颜色值中析取红、绿、蓝的强度值,分别返回一个 0~255 的亮度值。
函数原型:
BYTE GetRValue(TColor color);
BYTE GetGValue(TColor color);
BYTE GetBValue(TColor color);
使用范例:
BYTE nRed ,nBlue ,nGreen;
TColor color= RGB(4, 34, 253);
nRed = GetRValue(color);
nGreen = GetGValue(color);
nBlue = GetBValue(color);
结果说明:
nRed=4;nBlue =34;nGreen=253;
3. ScanLine
C++Builder 提供了 ScanLine 处理技术读取整行的像素颜色值,提高了图像处理的速度。
使用范例:
Graphics:: TBitmap *bitmap1;
Byte *newscan;
newscan= static_cast
(bitmap1->ScanLine[0]);
//newscan 指向位图 bitmap1 的第 1 行所有像素点的颜色值
参数说明:
Tbitmap 是位图类,封装了许多进行图像处理的属性和方法,其中包括了 Canvas 属性和 ScanLine
方法。
2.2 实例制作—— 逐点实现彩色图变成黑白图
1. 程序设计思路
先用 Image 组件将图像装载进来。从左到右,从上到下,使用 Image 的 Canvas 的 Pixels 属性逐
点取得每一个像素点的 color 值,然后使用 GetRValue、GetBValue 和 GetGValue 函数析取红绿蓝的
强度值,加以平均,即红、绿、蓝的强度值一样。将新的颜色值再赋给 Image 的每一点的 Pixels 属
性,即将彩色图变成黑白图。
2. 程序实现步骤
(1)打开 C++Builder,生成一个新的应用程序。往窗体中加入的组件如表 3 所示。
表 3 窗体中加入的组件及其属性
ok
w
※
8
※
o
ok
.n
et
ok
cn
续表 3
et
et ok
设置好的程序界面如图 4 所示。
w.
et
et ok
图 4 设置好的程序界面
(2)在 Unit7_1.cpp 开头部分定义全局变量:
Graphics::TBitmap *bitmap1;
Graphics::TBitmap *bitmap2;
int x,y; //x 存放图像的宽度,y 存放图像的高度
(3)编写单击 Button1 的 OnClick 事件,实现装载图片到 Image1 中(目前 Image 装载的是 Bmp
图片,4 节会介绍如何装载显示 jpeg 图片)。编写如下代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
bitmap1=new Graphics::Tbitmap;
bitmap2=new Graphics::Tbitmap;
String openname,extension;
if(OpenPictureDialog1->Execute())
{
openname=OpenPictureDialog1->FileName;
extension=openname.SubString(openname.Length()-2,3);
Image1->Picture->LoadFromFile(openname);
if(LowerCase(extension)=="bmp") //如果是 Bmp 图片
{
bitmap1->LoadFromFile(openname);
bitmap2->LoadFromFile(openname);
x=bitmap1->Width;
y=bitmap1->Height;
bitmap1->PixelFormat=pf24bit;
bitmap2->PixelFormat=pf24bit;
Image1->Picture->Bitmap->Assign(bitmap1);
}
}
}
(4)编写单击 Button2 的 OnClick 事件,实现彩色图变成黑白图。编写如下代码:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int rgb,i,j,r,g,b;
TColor color;
for(i=0;iWidth;i++)
{
for(j=0;jHeight;j++)
※ 9 ※
o
ok
cn
{
color= Image1->Canvas->Pixels[i][j];
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
rgb=(r+g+b)/3;
Image1->Canvas->Pixels[i][j]=RGB(rgb,rgb,rgb);
}
}
}
(5)保存编译运行,2.3 节还会继续用到这个工程文件。
3. 程序分析与说明
逐点实现彩色图变成黑白图,方法非常简单,易用,但是非常费时,所以程序运行时,尽量选
取字节比较小的图片文件来进行处理。
2.3 实例制作—— 用 ScanLine 方法实现彩色图快速变黑白图
1. 程序设计思路
(1)将图像装载到 bitmap 位图中,从上到下,使用 ScanLine 处理技术逐行读取像素颜色值。
(2)使用 GetRValue、GetGValue 和 GetBValue 函数析取红绿蓝的强度值,加以平均。
(3)使用 ScanLine 处理技术,逐行将新的颜色值赋给 bitmap 位图。
2. 程序实现步骤
(1)打开本文 2.2 节中保存的工程文件,编写单击 Button3 的 OnClick 事件,实现彩色图快速
变成黑白图。编写如下代码:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Byte *ptr,*newscan;
Byte r,g,b,bgr;
bitmap1->Assign(Image1->Picture->Graphic);
for(int i=0;i(bitmap1->ScanLine[i]);
newscan= static_cast(bitmap2->ScanLine[i]);
for(int j=0; jPicture->Bitmap->Assign(bitmap2);
}
(2)编译运行程序,单击 Button1 选取一个 Bmp 图片,再单击 Button3,彩色图能够快速变成
黑白图。
3. 程序分析与说明
要进行快速的图像处理,几乎都离不开 ScanLine 技术。而用 ScanLine 技术取得的 bitmap 每行
的颜色,其存放顺序是从左到右,每一点的蓝色、绿色、红色的亮度值,而不是红色、绿色、蓝色
的次序,这一点要特别注意。
※ 10 ※
o
ok
cn
3 实现图像的特殊显示效果
3.1 知识要点
1. Sleep 函数
Sleep 函数是系统的 API 函数库里提供的时间延迟函数。延迟在程序设计中非常有意义。现在
的计算机系统,完成一个 for 循环:
for(int i=0;i<10000;i++)
{
j=j+1;
}
可能也只是在一瞬间就完成了。而在实现图像的特殊显示效果时,需要在一个过程的完成后,
等待一定的时间,才运行程序下面的代码,这时就要使用到时间的延迟了。
Sleep 函数只有一个整型参数 cMilliseconds,用来指定需要延迟的时间,它的单位是毫秒。例如
在程序中加入下面的代码:
ShowMessage("现在开始计时");
Sleep(3000); //延迟三秒
ShowMessage("延迟了三秒!");
程序运行时在弹出“现在开始计时”的对话框后,程序在延迟了三秒钟的时间后,才弹出“延
迟了三秒!”对话框。
2. rand()、random()、Randomize()
这三个随机函数是用来产生一个随机数。
int rand()函数,它返回一个不大于 RAND_MAX 的随机数。RAND_MAX 是能够产生的最大
随机数。
int random(int num);它返回一个不大于 num 的随机数。
Randomize(int Number);为产生一个随机数,应先执行 Randomize 来初始化随机数生成器。
其中 Number 参数是可选的,是变量或任何有效的数值表达式。Randomize 用 Number 将 rand 函数
的随机数生成器初始化。如果省略 Number,则用系统计时器返回的值作为新的种子值。如果没有
使用 Randomize,则无参数的 Rand 函数将使用第一次调用 Rand 函数时的种子值。在使用随机函数
时,必须加入和
#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->LoadFromFile(openname);
bitmap2->LoadFromFile(openname);
bitmap1->PixelFormat=pf24bit;
bitmap2->PixelFormat=pf24bit;
x=bitmap1->Width;
※ 12 ※
o
ok
cn
y=bitmap1->Height;
}
}
(5)编写单击 Button2 的 OnClick 事件,使得 bitmap1 保持不变,经过 20 次均匀的变化,bitmap2
里的值由 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(bitmap2->ScanLine[i]);
for(int j=0; jPicture->Bitmap->Assign(bitmap2); //设置整幅图为黑色
for(int l=0;l<20;l++) //L 的取值代表着像素颜色变化的次数
{
for(int i=0;i(bitmap1->ScanLine[i]); //bitmap1 保持不变
newscan= static_cast(bitmap2->ScanLine[i]);
for(int j=0; jPicture->Bitmap->Assign(bitmap2);
Form1->Refresh(); //窗体重画
Sleep(1000); //Image1 每一次变化后程序停顿 1 秒钟,以便观测到图
像淡入的效果
}
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(bitmap1->ScanLine[i]);
newscan= static_cast(bitmap2->ScanLine[i]);
for(int j=0; jPicture->Bitmap->Assign(bitmap2);
Form1->Refresh(); //窗体重画
Sleep(1000); //Image1 每一次变化后程序停顿 1 秒钟,以便观测到图
像淡出的效果
}
for(int i=0;i(bitmap2->ScanLine[i]);
for(int j=0; jPicture->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(bitmap2->ScanLine[i]);
for(int j=0; jPicture->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(bitmap1->ScanLine[i]);
newscan= static_cast(bitmap2->ScanLine[i]);
for(int j=x1; jPicture->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 图像透明显示,