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
并让它为您计算图像类型。
我得到了一个 .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
并让它为您计算图像类型。