Delphi TFileFormatsList 在哪里获取其成员,这是否依赖于已安装的第三方库?

问题描述 投票:0回答:1

我发现 Delphi TImage 组件非常差。我正在使用各种 Delphi 版本,从 Delphi 6(2000 版,我们仍然有一些项目)开始,到东京、亚历山大结束。而且 TImage 对 ico/bmp/jpg 之外的文件支持很差,它没有 EXIF 自动旋转功能,也没有重采样/插值。

我尝试使用 Graphics32 TImage32 找到开源替代品,并且我已经安装了它。但我遇到了很多问题:

  • 使用 TImage32 的 Delphi 6 编译程序可以在 Windows 10 上加载 png 文件,但同一个 exe 在 Windows XP 上报告“未知文件扩展名 (.png)”(是的,我们仍然使用它们)
  • 有一些 jpg 文件可以在图像编辑器中打开,没有问题,但在 TImage32 中加载它们会报告“JPEG 错误 #52”
  • 我观察到更奇怪的事情:在我的Delphi 6中安装Graphics32组件后,以下版本无法将jpg文件加载到TImage(VCL TImage!)并报告“未知文件扩展名(.jpg)”。

好的,所以 - 很多问题,对于一个问题来说可能太多了。但我的问题是关于所有这些问题背后的核心问题:我看到 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]);

我猜 - 可能有两个问题:

  1. 图形类根本无法找到和加载。也许 Windows 10 有一些用于 png 文件的库,并且将 png 图形类加载到 FileFormats 中,但也许 Windows XP 没有这样的库,这就是为什么当 exe 在 Windows XP 上运行时我的 exe 无法加载这个图形类。
  2. 一种格式可以有多种实现,例如为 jpg。这就是为什么我的程序可以在安装 Graphics32 之前将 jpg 文件加载到 TImage 中,而 Graphics32 可能添加了其他实现(或者可能损坏或删除了它?),这就是为什么我的 TImage 在安装 Graphics32 后无法将 jpg 加载到 TImage 中。

那么 - 一切都归结为如何填充

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文件。因此 - 使用条目决定加载图形格式。所以 - 这是决定可用图形格式的一种机制。
  • 看起来,我的“JPEG 错误 #52”“jpg 文件”一般都是 png 文件,因此错误消息是正确的。

但是我仍在寻求解决方案,为什么我的带有 TImage32 的 Delphi 6 程序可以在 Window 10 上加载 png 文件,但在 Windows XP 上报告“未知文件格式 (.png)”。

在找到填充图形文件格式的整个范围后,如果当时没有人的话,我希望写下答案。

image delphi jpeg delphi-7 graphics32
1个回答
0
投票

因此,在uses子句中添加单位似乎可以解决问题。我补充了:

  • jpeg支持jpg、jpeg文件
  • cxGraphics 支持 png 文件(幸运的是,我安装了 DevExpress Suite 并迁移到 Delphi 6,cxGraphics 旨在用于其 TcxImageView 组件,该组件在支持许多不同的文件格式的同时,确实支持重采样/插值和 EXIF 自动计算。我读到,截至 2023/2024 年,DevExpress 添加了对 EXIF 自动旋转的支持,也许最新版本中也支持重新采样)。

Graphics32 有一些可以添加到

uses
条款而不是商业
cxGraphics
的单元吗?为了回答这个问题,我在 WinGrep 上搜索了“graphics32 master”来查找 RegisterFileFormat,但它什么也没返回。

所以 - 人们应该寻找其他第三方单位来支持更奇特的文件格式(png,tiff,webp;事实上,我的

cxGraphics
版本仅支持来自这三个文件的png),但是
Graphics32
非常适合重新采样和用于快速 EXIF 旋转(如果 EXIF 方向是通过其他方法确定的,例如通过使用 GDI+ 库读取 EXIF 信息)。

所以 - 这解释了对文件格式的支持并解决了我的所有问题。

© www.soinside.com 2019 - 2024. All rights reserved.