如何将Exif功能添加到TBitmap?

时间:2016-03-20 19:25:51

标签: delphi graphics exif delphi-xe7

我想创建一个通用函数,从磁盘加载'任意'类型的图像(gif,jpg,bmp,png等)并返回一个位图。

function LoadGraph(FileName: string): TBitmap;     {pseudocode}
begin
   if FileIsJpeg then 
     jpeg.LoadFromFile; 
     Bitmap.Exif.Assign(Jpeg.Exif);
end; 

当输入类型为Jpeg时,我需要访问Exif数据。 所以,我想创建一个这样的类助手:

TYPE
  TBitmapHelper = class helper for TBitmap
    public
      FExifData: TExif;
  end;

然而,似乎Delphi编译器没有这个功能(但是?),因为我得到了这个编译错误:

  

E2599辅助类型

中不允许字段定义

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

Delphi中有相当复杂的图形对象层次结构,旨在处理各种图像格式:TGraphic是一些可以从文件加载,保存到文件和在画布上绘制的图像的抽象类。 TPictureTGraphic的容器,它允许您只编写一行代码:

Picture.LoadFromFile(Filename);

它将查找正确的图形类,创建它并加载您的图像。

因此,您的解决方案之一是使用TPicture而不是TBitmap。对于TBitmap及其后代,TPicture将包含Bitmap属性,而对于其他人,您可以在Canvas上绘制或将Picture.Graphic分配给TBitmap(适用于TJPEGImage,TPNGImage,但仍然无法使用TIcon)。

如果它太笨重,例如,您不仅需要在屏幕上显示图像而是以某种方式修改它而不是每次都想到它是如何实际表示的,我建议从TBitmap创建后代,而不仅仅是帮助,它是很可能,你可以在期望TBitmap的程序中的任何地方传递这样的对象,但现在你可以用新的字段扩展它。我将做类似的事情来添加ICC配置文件功能(在BitmapHeaderV5中支持)。