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)

ASCII でエンコードされた有効な GIF バージョン番号について、後続の 3 バイトを確認することもできます。

`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= GIF

image/png= PNG

于 2015-08-10T00:19:22.273 に答える