TPNGImage.LoadFromFile EPNGInvalidFileHeader
Мне дали файл.png, который правильно отображается в Windows Explorer, но не загружается в мое приложение. Всякий раз, когда я пытался загрузить файл, он бросал 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. Открытие файла в блокноте показывает, что мета-информация Ado be 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, Paint, Gimp, Windows Photos - все визуализируют изображение, но я не могу загрузить его в свое приложение delphi.
Вот тестовый файл (да, он белый, потому что мне пришлось удалить из него информацию)
1 ответ
Заголовок файла, который у меня есть, на самом деле [255, 216, 255, 224, 0, 16, 74, 70], который, конечно, не является допустимым заголовком файла PNG.
Нет, это заголовок JPEG (ссылка, которую вы указали для файла с именем testimage.jpg
). Что объясняет почему TPNGImage
выходит из строя.
использование Vcl.Imaging.jpeg.TJPEGImage
вместо. Или лучше использовать Vcl.Graphics.TWICImage
и пусть он определит тип изображения для вас.