第2章 图形图像处理实例

实例22 图像的特效显示

    

Windows处理图像的API函数中,Bitblt()函数是非常重要而且是常用的函数之一。运用这个函数,可以实现图像的旋转和动态显示等效果。如果想在图像处理上有所突破,也必须熟练掌握Bitblt()函数。本实例实现的功能是以门帘效果来显示一幅BMP图像。

向窗体上添加一个TImage组件、一个OpenPictureDialog组件、一个TPaintBox组件和一个TButton组件,TImage组件充当原图片显示的载体,TPaintBox组件用来显示图像的特效。添加组件后的窗体如图2-1所示。

2-1  添加组件后的窗体

在显示图像的过程中,如果把原始图像分成几个部分,对每一个部分都逐步放大其显示范围以接近各部分图像的宽度,那么运行时可实现门帘式的显示效果。改变循环语句的步长或者改变Sleep()函数中的参数就可以改变程序运行的时间。

门帘效果的实现代码如下:

procedure TForm1.btnOpenClick(Sender: TObject);

var

    i,j:Integer;

    hDC1:HDC;

    hDC2:HDC;

begin

    if(self.OpenPictureDialog1.Execute()) then

    begin

        Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);

        Image1.Visible:=true;

 

        hDC1:=Image1.Canvas.Handle;

        hDC2:=PaintBox1.Canvas.Handle;

        for i:=0 to (Image1.Width div 10) do

        begin

            for j:=0 to 10 do

            begin

                BitBlt(hDC2,j*Image1.Width div 10,0,i+2,Image1.Height,

hDC1,j*Image1.Width div 10,0,SRCCOPY);

                Sleep(10);

            end;

        end;

    end;

end;

程序代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type

  TForm1 = class(TForm)

    Image1: TImage;

    btnOpen: TButton;

    Image2: TImage;

    OpenPictureDialog1: TOpenPictureDialog;

    PaintBox1: TPaintBox;

    procedure btnOpenClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

implementation

{$R *.dfm}

 

procedure TForm1.btnOpenClick(Sender: TObject);

var

    i,j:Integer;

    hDC1:HDC;

    hDC2:HDC;

begin

    if(self.OpenPictureDialog1.Execute()) then

    begin

        Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);

        Image1.Visible:=true;

 

        hDC1:=Image1.Canvas.Handle;

        hDC2:=PaintBox1.Canvas.Handle;

        for i:=0 to (Image1.Width div 10) do

        begin

            for j:=0 to 10 do

            begin

BitBlt(hDC2,j*Image1.Width div 10,0,i+2,Image1.Height,

hDC1,j*Image1.Width div 10,0,SRCCOPY);

                Sleep(10);

            end;

        end;

    end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

    self.OpenPictureDialog1.Filter := 'BMP files (*.bmp)|*.bmp';

end;

 

end.

保存文件,然后按F9键运行程序。在程序运行的初始画面上单击“打开”按钮,弹出一个提示用户选择图像文件的“打开”对话框。确认选择后,在窗体的TPaintBox组件上就会显示图像的门帘效果,特效过程中间的显示如图2-2所示。

2-2  程序运行结果

BitBlt()函数的参数中,特别值得一提的是参数dwRop,它提供了源图与目标图的15种组合方式。但是一般都采用SRCCOPY,即把源图复制给目标图。读者如果可以灵活运用这个参数,就可以制作出更加丰富多彩的图像特效。