TPNGImage.LoadFromFile EPNGInvalidFileHeader

TPNGImage.LoadFromFile EPNGInvalidFileHeader

我得到了一个 .png 文件,它在 windows 资源管理器中正确呈现,但不会加载到我的应用程序中。每当我尝试加载文件时,它都会抛出一个 EPNGInvalidFileHeader 异常,这里是简单的加载代码。

uses Vcl.Imaging.PngImage;

var
    image: TPngImage;
begin
    image := TPngImage.Create();
    try
        image.LoadFromFile('somefile');    
    finally
        image.Free();
    end;
end;

因此,查看 LoadFromFile 中引发异常的位置将我引向

const
    PngHeader: Array[0..7] of AnsiChar = (#137, #80, #78, #71, #13, #10, #26, #10);

procedure TPngImage.LoadFromStream(Stream: TStream);

...

    {Reads the header}
    Stream.Read(Header[0], 8);

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

...

我的文件头实际上是 [255, 216, 255, 224, 0, 16, 74, 70],这当然不是有效的 PNG 文件头。在记事本中打开文件会显示似乎是 adobe photoshop 元信息,其中引用了 Exif 和一些 XML

<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" photoshop:DateCreated="2017-04-04T19:38:31"/>
    </rdf:RDF>
</x:xmpmeta>

所以在所有这些解释之后我的问题是 我如何加载这个明显有效的 png 图像。 Windows Explorer, Paint, Gimp, Windows照片,全部呈现图像,但我无法在我的 delphi 应用程序中加载它。

Here is the test file(是的,它全是白色的,因为我不得不从中删除信息)

The header for the file I have is actually [255, 216, 255, 224, 0, 16, 74, 70] which is of course not a valid PNG file header.

不,它是 JPEG header(您提供的 link 用于名为 testimage.jpg 的文件)。这就解释了为什么 TPNGImage 失败了。

使用 Vcl.Imaging.jpeg.TJPEGImage instead. Or better, use Vcl.Graphics.TWICImage 并让它为您计算图像类型。