3

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

每次我做

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

我得到:

正在读取的文件不是有效的“便携式网络图形”图像,因为它包含无效的标题。此文件可能已损坏,请尝试重新获取

现在我猜这个问题是由这些行引起的(来自 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,但没有成功。

4

1 回答 1

9

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

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

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

于 2013-03-10T11:27:38.923 回答