myamanda

博客园 首页 新随笔 联系 订阅 管理
      WINDOWS环境下具有很强的图像处理功能,在DELPHI中同样提供了强大的图像处理功能,可以方便的实现图像的各种特技显示效果,下面是利用DELPHI实现图像的镜像显示的两种方法,其操作过程及显示效果各具特色。

一、镜像显示的原理

      所谓的镜像显示,就是好象一幅图像放在镜子头面,形成两幅绝对对称的图像,具体操作时具有水平镜向和垂直镜像之分,这其中包括两幅图像的显示过程,即正面图像和反面图像,正面图像的显示方法非常简单,在DELPHI中有多种方法,关键之处是反面图像的显示过程,这其中涉及图像的变形操作;实现图像变形的一种简单方法是重新安排象素位置,比如左面和右面的象素条一一对换,即可得到水平方向的反面
图像,同样通过上下象素条的对换则可得到垂直方向的反面图像。为了得到更美观的镜像显示效果,具体操作时不能先显示一幅正常图像,然后再显示反面图像,而需要两个图像同时从交叉点向外显示,这样将形成特殊的屏幕效果。

二、具体的操作过程
      在DELPHI中能够实现图像象素操作的有两种方法即两个命令,即Copyrect及BitBlt,具体使用方法如下:

      1.Copyrect(Dest:TRect;Canvas:Tcanvas;Source:TRect);其中:Dest:目标画布矩形Canvas:源画布Source:源矩形,这是一个DELPHI内部的命令,它主要用于某些控件的画布操作,即CANVAS属性下支持的一个图像复制命令,其功能是把图像从一个源RECT内,复制到目标RECT内,复制的图像具有自动伸缩性质,其功能类似于WINDOWSAPI函数的BITBLT,但操作相对简单;例如命令:

form1.canvas.copyrect(rect2,bitmap.canvas,rect1);

      则实现把RECT1中图像复制到窗体的RECT2中;用此命令实现镜像操作的过程是,首先从源图像上的边缘定义宽度为1的矩形RECT,同时从屏幕的中央位置向两侧定义相同尺寸的两个矩形RECT,之后把源图像写到两个目标RECT之中,通过循环过程完成整个图像的重写过程,即在屏幕上出现完整的镜像显示效果。

      2.BitBlt(hDestDC,x,y,nWidth,nHeight,hSrcDC,xSrc,ySrc,dwRop)这是一个WINDOWSAPI函数,在DELPHI中由于不用做单独的API函数说明,可以和调用DELPHI内部函数一样使用,所以使用非常方便;其中hDestDC源设备句柄,xy目标矩形右上角坐标,nWidthnHeight为目标矩形的宽度和高度,hSrcDC目标矩形句柄,xSrcySrc源位图矩形左上角坐标,dwRop光栅操作码,比如SRCCOPY为正常拷贝;利用此命令操作起来更为方便,无需事先定义操作区域,全部工作由BitBlt的参数完成,其原理就是把源图像的像素逐条向屏幕的两个方向拷贝,即可完成镜像显示效果。

      无论是利用上述的哪个命令,具体操作过程中可通过目标区域的灵活控制,实现具有特殊效果的镜像显示,比如从中心向外显示,或者从两侧向中心显示等等。
三、演示程序说明

      下面的程序分别用上述两条命令演示四种效果的镜像显示效果,程序需要四个Button和一个OpenDialog控件,程序运行之后首先需要选择一个位图文件,为了使显示效果明显可选用超出半个屏幕的图像,之后通过四个命令按钮即可分别演示四种屏幕效果,按钮1用CopyRect命令实现垂直方向的镜像显示,从中央向两侧显示;按钮2则用相同的命令实现水平方向的镜像显示,其显示过程中图像进行扭曲;按钮3用BitBlt命令实现
垂直方向的镜向显示,其显示过程是从屏幕的一侧逐渐向另一侧显示,就向两幅对称的图像面对面放在一起而逐渐揭开一样,具有特殊的屏幕效果;按钮4则实现相同效果的水平方向镜像显示。以上方法及程序在WINDOWS95系统、DELPHI环境下调试通过。附源程序清单:

//定义全程变量
var
Form1: TForm1;
bitmap:tbitmap;
i,numm:integer;
rect1,rect2,rect3:trect;
//准备图像源
procedure TForm1.FormActivate(Sender: TObject);
begin
bitmap:=tbitmap.create;
OpenDialog1.filter:=`Bitmap file(*.bmp)|*.bmp`;
if OpenDialog1.Execute then
bitmap.loadfromfile(OpenDialog1.filename);
Form1.Canvas.Draw(0,0, Bitmap);
end;
//按钮1垂直镜像
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.repaint;
for i:=0 to bitmap.height do
begin
with rect1 do
begin
left:=0;
top:=i;
right:=bitmap.width;
bottom:=i+1;
end;
with rect2 do
begin
left:=0;
top:=(form1.height div 2)-i-1;
right:=bitmap.width;
bottom:=(form1.height div 2)-i;
end;
with rect3 do
begin
left:=0;
top:=(form1.height div 2)+i-1;
right:=bitmap.width;
bottom:=(form1.height div 2)+i;
end;
canvas.copyrect(rect2,bitmap.canvas,rect1);
canvas.copyrect(rect3,bitmap.canvas,rect1);
end;
end;
//按钮2变形的水平镜像
procedure TForm1.Button2Click(Sender: TObject);
begin
form1.repaint;
for i:=0 to bitmap.width do
begin
with rect1 do
begin
left:=i;
top:=0;
right:=i+1;
bottom:=bitmap.height;
end;
with rect2 do
begin
left:=(form1.width div 2)-i-1;
top:=i;
right:=(form1.width div 2)-i;
bottom:=bitmap.height+i;
end;
with rect3 do
begin
left:=(form1.width div 2)+i-1;
top:=i;
right:=(form1.width div 2)+i;
bottom:=bitmap.height+i;
end;
canvas.copyrect(rect2,bitmap.canvas,rect1);
canvas.copyrect(rect3,bitmap.canvas,rect1);
end;
end;
//按钮3垂直镜像
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.repaint;
if bitmap.height< =form1.height div 2 then
numm:=bitmap.height else
numm:= form1.height div 2;
for i:=0 to numm do
begin
bitblt(form1.canvas.handle,0,i,bitmap.width,i,
bitmap.canvas.handle,0,bitmap.height-i,srccopy);
end;
end;
//按钮4水平镜像
procedure TForm1.Button4Click(Sender: TObject);
begin
form1.repaint;
if bitmap.width< =form1.width div 2 then
numm:=bitmap.width else
numm:= form1.width div 2;
for i:=0 to numm do
begin
bitblt(form1.canvas.handle,i,0,i,bitmap.height,
bitmap.canvas.handle,bitmap.width-i,0,srccopy);
end;
end;
end.
posted on 2009-08-13 15:39  myamanda  阅读(793)  评论(0编辑  收藏  举报