2015-08-09 3 views
1

Я несу изображения на URL и показываю TImage. Я буду работать с JPG, GIF и PNG. Но я не знаю, как узнать, какое расширение обладает каждым файлом, а затем дифференцировать. Как мне получить заголовок или какой-либо другой метод для меня, чтобы узнать, какой тип файла: GIF или PNG или JPG?Узнайте тип файла (GIF, JPG, PNG) - DELPHI

var 
    MS : TMemoryStream; 
    GIf: TGIFImage; 
    jpegimg: TJPEGImage; 


begin 
    MS := TMemoryStream.Create; 
    GIf := TGIFImage.Create; 
    jpegimg := TJPEGImage.Create; /////// 

    try 
     try 
     IdHTTP1.get('http://forum.wmonline.com.br/uploads/av-8929.jpg',MS); 
     Ms.Seek(0,soFromBeginning); 
     //Gif.LoadFromStream(MS); 
     //Logo.Picture.Assign(GIF); 
     jpegimg.LoadFromStream(MS); 
     Logo.Picture.Assign(jpegimg); 
     except 
     ShowMessage('ERRO'); 
     Exit; 
     end; 
    finally 
    FreeAndNil(GIF); 
    FreeAndNil(MS); 
    jpegimg.Free; //// 
    end; 
+2

который файл может быть здесь. у вас есть один выбор. 'IdHTTP1.get ('...../av-8929.jpg', ...)', если вы не доверяете расширению файла, смотрите заголовок файла. [Portable_Network_Graphics] (https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header). –

ответ

4

Я нашел способ сделать то, что хочу, потому что есть URL-адреса, которые не отображают расширения.

Просто извлечь тип изображения из ответа сервера:

header := IdHTTP1.Response.ContentType; 

image/jpeg = JPG

image/gif = GIF

image/png = PNG

+0

@Remy, @abcd :: ** OP: ** «Я хочу, потому что есть URL-адреса, которые не показывают расширения». Простой тест. Один файл 5206.gif тот же файл с другими расширениями: 5206.jpg и файл без расширения, что вы получаете с помощью 'header: = IdHTTP1.Response.ContentType':' 5206.gif' -> ** image/gif ** :: '5206.jpg' -> ** image/jpeg ** ::' 5206' -> ** text/plain **. Правильный способ получить тип файла ??? В самом деле ? –

+2

@ moskito-x: ответственность сервера заключается в отправке правильного «Content-Type». Имена файлов являются необязательными. Если сервер использует расширение файла на стороне сервера, чтобы сообщить о его типе, и в нем нет расширения, тогда сервер должен представлять отчет «application/octet-stream», «text/plain» - ошибка. Вероятно, это значение по умолчанию, которое сервер возвращается. Чтобы компенсировать это, вам придется игнорировать «Content-Type» и посмотреть фактические байты файла, чтобы проверить, присутствует ли заголовок изображения или нет.Большинство форматов изображений легко идентифицируются по заголовку. –

+0

@RemyLebeau: Вот что я сказал: ** Посмотрите на фактические байты файла, чтобы проверить, присутствует ли заголовок изображения или нет **. Спасибо за это. –

8

Существуют механизмы, предназначенные для обеспечения описание содержимого запроса (или ответа), но любой внешние метаданные могут быть ненадежными, полностью зависящими от точной реализации и настройки метаданных. В некоторых случаях метаданные могут быть неверными или полностью отсутствовать.

К счастью, во многих форматах файлов в спецификациях для типов файлов изображений вы указываете, что все мандаты имеют определенный заголовок, чтобы идентифицировать файл (или поток) как соответствующий (или стремящийся соответствовать) соответствующей спецификации.

first 3 bytes of a GIF file являются:

`G` `I` `F` (ASCII) 

Вы также можете проверить последующие 3 байта для действительного числа GIF версии, также закодированы в ASCII:

`8` `9` `a` or `8` `7` `a` 

first 8 bytes of a PNG file имеют значения:

137 80 78 71 13 10 26 10 (decimal) 

first 2 bytes of a JPEG fil е являются:

FF D8 (hex) 

Так, чтобы обнаружить формат данных в поток ответа вам нужно только проверять в большинстве первых 8 байтов потока для одного из этих ожидаемых значений заголовков.

+1

Мне интересно, почему вы считаете, что использование типа контента - плохая идея. –

+2

Кроме того, я нахожу тревожным, что у этого есть значительно больше голосов, чем у соответствующего HTTP-способа. –

+0

@DavidHeffernan: ** OP: ** «Я хочу, потому что есть URL-адреса, которые не показывают расширения». Простой тест. Один файл 5206.gif тот же файл с другими расширениями: 5206.jpg и файл без расширения, что вы получаете с помощью 'header: = IdHTTP1.Response.ContentType':' 5206.gif' -> ** image/gif ** :: '5206.jpg' -> ** image/jpeg ** ::' 5206' -> ** text/plain **. Правильный способ получить тип файла ??? В самом деле ? Посмотрите на 'MemoryStream' достаточно 10 байтов, и вы можете быть shure, какой тип файла вы загрузили. –

Смежные вопросы