图像处理,是可视化编程的基础内容。
在Windows操作系统中,一切要输出到屏幕上的东西都是通过图形处理这部分的内容来实现的。
比如一个程序使用了标签控件,它看起来似乎并没有用到什么图形处理,但实际上标签控件就是通过使用GDI库中的图形处理函数来实现的。可见图形处理在编程中的重要性。
图像处理在实际的应用中也极具价值。
平面制作、动画制作等都离不开它。这一部分的内容十分繁多。我本次研究的内容,只是其中最基础的、最重要一部分。
探究Delphi的图形处理 之二 -- 基本图像处理函数 |
|
第二章 图像处理函数
2.1 为什么选择Delphi
所有的可视化编程语言都能够进行图像处理。但由于这些语言的定位不同,它们在进行图形处理的效率和便捷程度上也各不相同。
实际上,Visual C 的图像处理效率是最高的,Delphi已经把绝大多数GDI绘图函数都封装成可直接调用的类,使用它进行图形处理操作十分方便,而且Delphi 是Pascal演变而来的,Pascal具有严谨易读的特点,因此很容易上手。
2.2 Delphi中用于图形处理的类
Delphi为我们提供了许多图形图像方面的类,合理地使用这些类,我们可以方便地开发出各种图形处理程序。
这些类有TPicture、TBitmap、TGraphic、TIcon、TJPEGImage和TCanvas。其中,
TCanvas类用于绘图,
TPicture、TBitmap、TIcon和TJPEGImage是专门用来处理图片的类,
TGraphic是一个抽象类,一般不直接使用。
TPicture类可以载入所有支持的图片,
而TBitmap、TIcon、TJPEGImage分别用于处理各种类型的图片。
在实际应用中,我们一般用这些具体类型的类载入图片,再将图片转为Bitmap格式来处理。TPicture、TIcon、TJPEGImage类一般只用于输入和输出。例如,下面的代码可以载入一幅任意支持格式的图片(Delphi所支持的格式为bmp、jpg、dib、wmf和emf)。
Var Pic:TPicture;
Begin
Pic := TPicture.Create;
Pic.LoadFromFile(FileName);
End;
用TPicture类来载入图片时,该类会根据文件名的扩展名来决定用何等方式来打开图片。
这就出现了一个问题,如果这个图片的扩展名被用户非法修改,程序就会把这个图片视为无效图片。在真正编程中,我们要用TPicture、TBitmap、TJPEGImage、TIcon依次尝试去打开图片。
另外,Delphi本身是不支持GIF文件格式的。我们可以借用一个第三方的类——GIFImage来让Delphi支持它。这个类在附带的光盘中可以找到。最终我们用下面的代码来完成载入图片的操作。
Procedure ReadPicture(FileName: String; Bitmap: Graphics.TBitmap); var pic:TPicture;Bit:Graphics.TBitmap;jpgPic:TJPEGImage;FGifPic:TGIFImage; icoPic:TIcon; begin FGifPic := TGifImage.Create; Pic:=Tpicture.Create; bit:=Graphics.TBitmap.Create; jpgPic:=TJPEGImage.Create; icoPic:=TIcon.Create; try pic.LoadFromFile(FileName); if uppercase(ExtractFileExt(Filename)) = '.ICO' then begin Bitmap.Height:=pic.Height; Bitmap.Width:=Pic.Width; Bitmap.Canvas.Draw(0,0,Pic.Graphic); end else bitmap.Assign(pic.Graphic); except try bitmap.LoadFromFile(FileName); except try jpgPic.LoadFromFile(FileName); bitmap.Assign(jpgPic); except try icoPic.LoadFromFile(Filename); bitmap.Free; Bitmap:=TBitmap.Create; bitmap.Height:=icoPic.Height; bitmap.Width:=icoPic.Width; bitmap.Canvas.Draw(0,0,icoPic); except try FgifPic.LoadFromFile(FileName); Bitmap.Assign(FGifPic.Bitmap); except bitmap.Height:=bitmap.Canvas.TextHeight('8'); bitmap.Width:=bitmap.Canvas.TextWidth('无效图片'); BitMap.Canvas.TextOut(0,0,'无效图片'); end;{try} end; end;{try} end;{try} end;{try} Pic.Free ; bit.Free; jpgPic.Free; icoPic.Free; FGifPic.Free; end; |
保存图片的方法跟打开图片的方法