1

我为每个 URL 携带图像并显示 TImage 。我将使用 JPG、GIF 和 PNG。但我不知道如何找出每个文件拥有什么样的扩展名,然后区分。如何获取 header 或任何其他方法让我知道什么类型的文件: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;
4

2 回答 2

9

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

幸运的是,与许多文件格式一样,您提到的图像文件类型的规范都要求使用特定的标头来标识文件(或流)符合(或希望符合)相关规范。

GIF 文件的前 3 个字节是:

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

您可能还希望检查随后的 3 个字节以获取有效的 GIF 版本号,也以 ASCII 编码:

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

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

137 80 78 71 13 10 26 10   (decimal)

JPEG 文件的前 2 个字节是:

FF D8   (hex)

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

于 2015-08-10T02:02:56.827 回答
4

我找到了一种方法来做我想做的事,因为有些 URL 不显示扩展名。

只需从服务器响应中提取图像类型:

header := IdHTTP1.Response.ContentType;

image/jpeg= JPG

image/gif= 动图

image/png= PNG

于 2015-08-10T00:19:22.273 回答