delphi - 将 PNG 加载到 TImage

标签 delphi png delphi-xe

我正在尝试使用 PNGImage 库将 PNG 图像加载到 TImage,

每次我这样做

Image1.Picture.LoadFromFile('c:\c.png');

我明白了:

The file being read is not a valid "Portable Network Graphics" image because it contains an invalid header. This file may be corrupted, try obtaining it again

现在我猜这个问题是由这些行引起的(来自 PngImage 库):

{Characters for the header}
const
  PngHeader: Array[0..7] of Char = (#137, #80, #78, #71, #13, #10, #26, #10);

{Loads the image from a stream of data}
procedure TPngObject.LoadFromStream(Stream: TStream);
var
  Header    : Array[0..7] of Char;
  HasIDAT   : Boolean;

  {Chunks reading}
  ChunkCount : Cardinal;
  ChunkLength: Cardinal;
  ChunkName  : TChunkName;
begin
  {Initialize before start loading chunks}
  ChunkCount := 0;
  ClearChunks();
  {Reads the header}
  Stream.Read(Header[0], 8);

  {Test if the header matches}
  if Header <> PngHeader then
  begin
    RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText);
    Exit;
  end;

我尝试将 Char 更改为 AnsiChar,但没有成功。

最佳答案

您正在自己编译 PNGImage 单元,并且您有一个为 Unicode 之前的 Delphi 设计的过时的 PNGImage。这就是你面临的根本问题。

PNG 功能现已内置于 Delphi 中。 PNGImage 单元是产品附带的标准库的一部分。只需删除您的 PNGImage 代码版本即可。请确保删除 .pas 和 .dcu 文件,以便您的错误版本无法使用。

然后将 PNGImage 包含在您的一个单元的 use 子句中,我猜您已经这样做了。这将导致使用该单元的内置版本。

关于delphi - 将 PNG 加载到 TImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15321669/

相关文章:

delphi - 带有firemonkey的屏幕键盘[Mac]

delphi - 服务不会处理消息

c++ - 我如何在 delphi 中定义 IOCTL_ATA_PASS_THROUGH?

delphi - 如何在 Delphi XE 应用程序中使用 CHM HTML 帮助文件?

delphi - TAwImageGrid - 如果删除最后一个图像,程序会泄漏内存

delphi - 我怎样才能跟踪delphi中的点

c++ - 下一个 block 的偏移量不正确(DEFLATE/PNG)?

delphi - TWICImage : How to overlay transparent PNG on JPG?

r - 在 R 中并排显示同一 pdf 中的两个热图

Delphi 脚本和 ASM