我发现 Delphi TImage 组件非常差。我正在使用各种 Delphi 版本,从 Delphi 6(2000 版,我们仍然有一些项目)开始,到东京、亚历山大结束。而且 TImage 对 ico/bmp/jpg 之外的文件支持很差,它没有 EXIF 自动旋转功能,也没有重采样/插值。
我尝试使用 Graphics32 TImage32 找到开源替代品,并且我已经安装了它。但我遇到了很多问题:
好的,所以 - 很多问题,对于一个问题来说可能太多了。但我的问题是关于所有这些问题背后的核心问题:我看到 VCL 代码:
procedure TPicture.LoadFromFile(const Filename: string);
var
Ext: string;
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
Ext := ExtractFileExt(Filename);
Delete(Ext, 1, 1);
GraphicClass := FileFormats.FindExt(Ext);
if GraphicClass = nil then
raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]);
NewGraphic := GraphicClass.Create;
try
NewGraphic.OnProgress := Progress;
NewGraphic.LoadFromFile(Filename);
except
NewGraphic.Free;
raise;
end;
FGraphic.Free;
FGraphic := NewGraphic;
FGraphic.OnChange := Changed;
Changed(Self);
end;
这是在将图像加载到 TImage(来自 VCL)和 TImage32(来自 Graphics32)时执行的,核心是:
GraphicClass := FileFormats.FindExt(Ext);
if GraphicClass = nil then
raise EInvalidGraphic.CreateFmt(SUnknownExtension, [Ext]);
我猜 - 可能有两个问题:
那么 - 一切都归结为如何填充
Graphics.FileFormats
列表的方法?
我看到VCL Graphics.pas代码:
constructor TFileFormatsList.Create;
begin
inherited Create;
Add('wmf', SVMetafiles, 0, TMetafile);
Add('emf', SVEnhMetafiles, 0, TMetafile);
Add('ico', SVIcons, 0, TIcon);
Add('bmp', SVBitmaps, 0, TBitmap);
end;
并且它没有jpg文件。所以 - 我猜,FileFormats 是使用默认的 4 种格式创建的,然后其他一些库可以以某种方式向此列表添加条目?
我不知道这是如何发生的,这是我问题的核心 -
FileFormats
列表如何获取附加条目,以便这些条目可以由 TImage、TImage32(Graphics32)使用,并且附加条目的添加是否依赖是否存在一些 dll、库,是否可能为其他格式注册了 Windows COM 库?
我的理解是我的开发机器上的文件格式数量出了问题。
已添加进度更新:
jpeg
添加到uses子句中,然后TImage也可以加载jpg文件。因此 - 使用条目决定加载图形格式。所以 - 这是决定可用图形格式的一种机制。但是我仍在寻求解决方案,为什么我的带有 TImage32 的 Delphi 6 程序可以在 Window 10 上加载 png 文件,但在 Windows XP 上报告“未知文件格式 (.png)”。
在找到填充图形文件格式的整个范围后,如果当时没有人的话,我希望写下答案。
因此,在uses子句中添加单位似乎可以解决问题。我补充了:
Graphics32 有一些可以添加到
uses
条款而不是商业 cxGraphics
的单元吗?为了回答这个问题,我在 WinGrep 上搜索了“graphics32 master”来查找 RegisterFileFormat,但它什么也没返回。
所以 - 人们应该寻找其他第三方单位来支持更奇特的文件格式(png,tiff,webp;事实上,我的
cxGraphics
版本仅支持来自这三个文件的png),但是Graphics32
非常适合重新采样和用于快速 EXIF 旋转(如果 EXIF 方向是通过其他方法确定的,例如通过使用 GDI+ 库读取 EXIF 信息)。
所以 - 这解释了对文件格式的支持并解决了我的所有问题。