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 и пусть он определит тип изображения для вас.

Другие вопросы по тегам