【问题标题】:Delphi Not Loading Jpg Image - Thinks it's a Bitmap?Delphi 不加载 Jpg 图像 - 认为它是位图?
【发布时间】:2017-06-27 16:21:40
【问题描述】:

我在尝试在 Delphi 中加载 Jpg 图像时遇到问题。

我的调用代码是:

AImage.Picture.LoadFromFile( AImageFilePathStr );

我已经关注了 Vcl.Graphics TFileFormatsList.FindExt 方法。

在那里我添加了一个手表(某些变量,如“I”由于优化而无法访问),但当 I=8 时 FindExt 匹配。第 4 项匹配,“I”从 11 倒数到 0。

TFileFormatType(Items[8]) 上的监视扩展为 GraphicClass is TBitmap and Extension is 'jpg'。所以扩展名匹配,但GraphicClass是TBitmap。

稍后抛出异常“位图图像无效”。

为什么 Delphi 似乎认为这个 Jpg 图像是位图?

谢谢。

【问题讨论】:

  • .jpg 映射到 TBitmap 的唯一方法是,如果 VCL 之外的用户代码错误地使用 TPicture.RegisterFileFormat() 注册了它。将标准 Vcl.Imaging.Jpeg 单元添加到您的 uses 子句中以正确注册 JPG。
  • 这个问题不能按原样回答。您需要minimal reproducible example 来解释其他无法解释的行为。好吧,我想很容易假设格式已被某些东西错误注册,但无法回答的部分是那个东西。
  • 我很抱歉。我以后会这样做的。

标签: delphi bitmap jpeg


【解决方案1】:

Vcl.Imaging.Jpeg 添加到我的主要单元中的uses 子句就是答案。

我还不明白为什么,但这解决了它。 :-)

【讨论】:

  • 附加信息:
  • 没有用户调用 TPicture.RegisterFileFormat。通过将 Jpeg 添加到我的使用中,Vcl.Graphics TFileFormatsList.FindExt 将其计数增加到 14 个注册类。最新添加的优先,并将扩展名 jpg 正确匹配到 TJPEGImage。
  • 这并不能解释为什么 TBitmap 最初是为 JPG 注册的。 VCL 的本地类注册不这样做,所以它必须是你项目中的其他东西。
  • VCL 的原生类注册实际上在 TFileFormatsList 的构造函数中错误注册了类。 Png、gif、jpeg 和 jpg 扩展名都默认注册为 TBitmap 类型。添加带有扩展名的后续注册将取代 VCL 的早期注册。我已将此发送到 QualityCentral,因为“位图图像无效”应替换为 VCL 中已存在的通用“未知图片文件扩展名”。
  • {$IF DEFINED(CLR)} 中的任何代码都用于 Delphi.NET,它在多年前就消失了(但仍然存在于源代码中)。在 Win32 中,TFileFormatsList 构造函数仅为bmp 文件注册TBitmap。在.NET 中,它为多种格式注册TBitmap,因为TBitmap 使用.NET 的System.Drawing.Bitmap 类来支持各种格式并提取它们的像素数据。在 Win32 中情况并非如此,其中每种格式都是一个单独的类(WIC 的情况除外)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多