将PNG加载到TImage中

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,但没有成功。


我很想自己调查这个PNG文件。你能提供一下吗? - Andreas Rejbrand
你是指我正在加载的图片吗?在这里:http://google.uci.edu/images/googleicon.png - Ouerghi Yassine
1
哪个版本的Delphi? - David Heffernan
你能加载其他的PNG文件吗? - angelatlarge
不行,我无法加载任何其他的PNG文件。 - Ouerghi Yassine
@yassine_hell:好的,我最初的想法是PNG文件已经损坏了,但似乎不是这种情况。很可能是David注意到了这个问题。 - Andreas Rejbrand
1个回答

9
您正在自行编译PNGImage单元,并且拥有一个旧版的PNGImage,适用于Unicode前的Delphi版本。这是您面临的根本问题。
现在,PNG功能已经内置到Delphi中。PNGImage单元是随产品一起提供的标准库的一部分。只需删除您的PNGImage代码版本。确保删除.pas和.dcu文件,以确保无法使用您的错误版本。
然后,在您的单位中的uses从句中包含PNGImage,我猜您已经这样做了。这将导致使用内置版本的单元。

我试图删除pngimage.pas文件,但现在无法编译,出现“无法解析单元名称'pngimage'...”的错误。请问如何恢复内置的文件? - Ouerghi Yassine
2
@yassine_hell:我不敢问...你是说你已经删除了你正在使用的唯一一份“pngimage”,现在想知道如何恢复吗? - Andriy M
记录一下,XE2 中这个单元的实际文件名是 Vcl.Imaging.pngimage,但是在命名空间中,它只是 PNGImage - Jerry Dodge
@Jerry 这是正确的,但yassine使用的是比命名空间还要早的XE。 - David Heffernan
糟糕,谢谢指出,我自然而然地想到了XE2,因为那是我一直在使用的。 - Jerry Dodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接