找出文件的类型(GIF,JPG,PNG) - DELPHI

abc*_*bcd 1 delphi idhttp delphi-xe5

我正在为每个URL提供图像并显示TImage.我将使用JPG,GIF和PNG.但我不知道如何找出每个文件的扩展名,然后进行区分.我如何获得标题或任何其他方法让我知道什么类型的文件:GIF或PNG或JPG?

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;
Run Code Online (Sandbox Code Playgroud)

Del*_*ics 8

存在旨在允许描述请求(或响应)的内容的机制,但是任何外部元数据可能是不可靠的,完全取决于所涉及的元数据的准确实现和设置.在某些情况下,元数据可能不正确或完全丢失.

幸运的是,与许多文件格式相同,您提到的图像文件类型的规范都要求使用特定的标头来将文件(或流)标识为符合(或有志于符合)相关规范.

GIF文件前3个字节是:

`G` `I` `F`    (ASCII)
Run Code Online (Sandbox Code Playgroud)

您可能还希望检查后续的3个字节是否有有效的GIF版本号,也是用ASCII编码的:

`8` `9` `a`   or `8` `7` `a`
Run Code Online (Sandbox Code Playgroud)

PNG文件前8个字节具有以下值:

137 80 78 71 13 10 26 10   (decimal)
Run Code Online (Sandbox Code Playgroud)

JPEG文件前2个字节是:

FF D8   (hex)
Run Code Online (Sandbox Code Playgroud)

因此,要检测响应流中数据的格式,您只需要检查流的前8个字节,以获取其中一个预期的标头值.

  • @DavidHeffernan:"我想知道为什么你觉得使用内容类型是一个坏主意" - 因为它可能有时候是错误的.例如,moskito的例子,请求`5206.jpg`(这只是带有不同扩展名的'5206.gif`的副本)报告`image/jpeg`而不是`image/gif`,并且请求`5206`没有任何扩展报告`text/plain`而不是`image/gif`甚至`application/octet-stream`.因此,依赖于HTTP`Content-Type`标头,尽管*preferred*解决方案,如果服务器配置错误,有时可能会出错. (4认同)
  • 此外,我发现令人不安的是,这个获得的投票比正确的HTTP方式要多得多. (2认同)
  • @David - 我说这是个坏主意吗?不,我确实观察到内容类型不一定是可靠的.这是一个简单的事实.某人/某事必须设置外部元数据,而且可能无法正确执行.对于文本等上下文,内容类型可能是至关重要的(例如,区分xml和html),但在这些特定文件类型的情况下,您可以从实际内容中非常轻松有效地确定内容的实际类型本身的方式肯定是可靠的,**外部**元数据可能不是. (2认同)
  • @Free Consulting - 我不明白为什么你会觉得它令人不安."*正确的HTTP方式*"是一个令人惊讶的模糊概念.错误实现的HTTP服务器可能无法提供可靠的内容类型,遗憾的是,根据我的经验,这并不常见.构建HTTP**服务器**时,如何确定所服务的图像文件的内容类型的正确值?如果文件名称不正确,"正确的文件系统方式"将不起作用."可靠"胜过"适当".理想的合适=可靠,但我们生活在现实世界,而不是理想. (2认同)