2016-03-20 79 views
1

我想创建一个通用函数,用于从磁盘加载任意类型的图像(gif,jpg,bmp,png等)并返回位图。如何将Exif功能添加到TBitmap?

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 Field definition not allowed in helper type

如何实现这一目标?

+0

我可以这样做:函数LoadGraph(FileName:string; out Exif:TExif):TBitmap但不像类助手那么优雅。对? – Ampere

+0

不,助手不能添加数据成员,只能添加方法和属性。但是一个数据成员不会被广泛使用。数据何时写入?你会如何钩住文件读取? –

+0

因此,在我看来,您不会尝试将此功能添加到“TBitmap”,您会找到解决该问题的另一种方法。 –

回答

1

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

Picture.LoadFromFile(Filename); 

,它会查找正确的图形类,创建并加载你的形象。

所以你的解决方案之一是使用TPicture而不是TBitmap。对于TBitmap及其后代,TPicture将包含Bitmap属性,其他可以在Canvas上绘制或将Picture.Graphic分配给TBitmap(适用于TJPEGImage,TPNGImage,但仍然会因TIcon而失败)。例如,如果它太笨重,你不需要在屏幕上显示图像,而是以某种方式修改它,而不是每次都想它实际表示的方式,我建议从TBitmap创建后代,而不仅仅是帮助器,这很有可能,你可以在TBitmap所在的程序中的任何地方传递这样的对象,但现在你可以用新字段扩展它。我打算做类似的事情来添加ICC配置文件功能(在BitmapHeaderV5中支持)。

+1

除了JPEG/PNG,我的LoadGraph函数也支持其他格式...所以TPicture不适合我。 – Ampere

+0

@SolarWind您可以使用TPicture.RegisterFileFormat添加其他格式,就像在GraphicEx库中完成的一样。 –

+1

对不起,但你仍然没有显示如何将exif数据结构附加到位图(或图片)对象。 – Ampere