Delphi中如何编写图像解析组件

时间:2010-03-03 17:32:14  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:Image属性任意的加载BMP、WMF、EMF等格式的图像。如果还想增加对JPEG的支持,只需要添加一个JPEG单元即可。甚至在Image中加载一张JPEG后,Delphi会自动添加一个JPEG单元。一切做起来就是这么的简单。基础格式都已经封装在了VCL中,那么Delphi对类似JPEG这样图像格式的支持是如何实现的呢?其实从TPicture中很容易看出其中的实现过程,它可以理解为所有图像对象的容器。...
  正文:Delphi中如何编写图像解析组件

Delphi作为一个强大的RAD开发工具,在应用软件的开发方面一直有着它的独特优势。这种优势同样体现在图像相关软件的开发上。如果你要在桌面上放置一张图像,只需要简单的在桌面上放置一个Image控件,然后就可以通过其Image属性任意的加载BMP、WMF、EMF等格式的图像。如果还想增加对JPEG的支持,只需要添加一个JPEG单元即可。甚至在Image中加载一张JPEG后,Delphi会自动添加一个JPEG单元。一切做起来就是这么的简单。基础格式都已经封装在了VCL中,那么Delphi对类似JPEG这样图像格式的支持是如何实现的呢?

其实从TPicture中很容易看出其中的实现过程,它可以理解为所有图像对象的容器。

如JPEG.pas中有如下两句代码:

TPicture.RegisterFileFormat('jpeg', sJPEGImageFile, TJPEGImage);
TPicture.RegisterFileFormat('jpg', sJPEGImageFile, TJPEGImage);

(sJPEGImageFile = 'JPEG Image File',见JConsts.pas)

什么意思呢?可以理解为将TJPEGImage注册为jpeg、jpg两种后缀图像文件的类。

其实质就是将后缀,图像描述,具体图像解析类等信息保存到了FileFormats。

具体见如下代码:

var FileFormats: TFileFormatsList = nil;

class procedure TPicture.RegisterFileFormat(const AExtension,
  ADescription: string; AGraphicClass: TGraphicClass);
begin
  GetFileFormats.Add(AExtension, ADescription, 0, AGraphicClass);
end;

function GetFileFormats: TFileFormatsList;
begin
  if FileFormats = nil then FileFormats := TFileFormatsList.Create;
  Result := FileFormats;
end;

而TPicture默认支持四种图像格式是因为TFileFormatsList的构造函数中已进行了添加。

constructor TFileFormatsList.Create;
begin
  inherited Create;
  Add('wmf', SVMetafiles, 0, TMetafile);
  Add('emf', SVEnhMetafiles, 0, TMetafile);
  Add('ico', SVIcons, 0, TIcon);
  Add('bmp', Svbitmaphotoshop/ target=_blank class=infotextkey>ps, 0, TBitmap);
end;

也正是通过FileFormats中保存的信息,控件OpenPictureDialog中自动生成了所支持文件类型的列表。

那么该如何编写这些图像解析类呢?

TGraphic是TBitmap、TIcon、TMetafile对象的基类。同样这里的图像解析类也应该从TGraphic派生,利用很多VCL中已经封装了的代码,可以省去很多工作。

实现基础功能一般只需要重载三个成员:

TXXXImage = class(TGraphic)
protected
  procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;//绘制图像到画布
public
  procedure LoadFromStream(Stream: TStream); override; //从流中获取图像数据
  procedure SaveToStream(Stream: TStream); override; //将图像数据写入流中
end;

因为TGraphic.LoadFromFile/TGraphic.SaveToFile中已经实现了由文件名读取数据到流的/将流中的数据写入到对应文件的功能,无特殊需要这里可以不用重载。而成员Draw自然就是用于实现将图像绘制到画布,由于TCanvas对GDI的完善封装,这里不需要考虑如何将图像利用GDI绘制到窗体的这个过程。剩下的就只是编写图像解析部分的代码啦。

下面就以RAS格式为例做进一步的探讨。

这里没有用TGraphic作为基类,而是用了TBitmap,这样进一步把Draw的实现过程都省了,只需要在LoadFromStream中实现转化为位图的过程就可以了。

type

TRASGraphic = class(TBitmap)
public
  procedure LoadFromStream(Stream: TStream); override;
  procedure SaveToStream(Stream: TStream); override;
end;

//定义描述RAS文件头的记录类型
TRASHeader = packed record
  Magic,               //标记
  Width,               //宽
  Height,              //高
  Depth,               //色深
  Length,              //图像数据长度,可能会等于0 《Delphi中如何编写图像解析组件》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/13025.html

 1/8    1 2 3 4 5 6 下一页 尾页


关键字:

关于《Delphi中如何编写图像解析组件》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td