簡易バイナリチェックつきの画像読み込み関数

FDELPHIでRESしたものそのまま持ってきました。簡易バイナリチェックをして画像を読み込む関数です。TPictureは拡張子が登録されていない場合例外を生成しますが、この関数を使えば読み込むことができるようになります。

type
  TImageType = (itUnknown, itJpeg, itBitmap);

  TUnionFileHeader = packed record
    case Integer of
      0:(//JPEG用
         Code_1 : array[0..3]of Char;
         Dummy_1: Word;
         Code_2 : array[0..3]of Char;
        );
      1:(//ビットマップ用
         bfType: Word;
         bfSize: DWORD;
         bfReserved1: Word;
         bfReserved2: Word;
        );
  end;

function GetGraphicFormat(const FileName: String): TImageType;
//バイナリを調べる
var
  F: TFileStream;
  Buffer: TUnionFileHeader;
begin
  Result := itUnknown;
  F := TFileStream.Create(FileName, fmOpenRead);
  try
    FillChar(Buffer, SizeOf(TUnionFileHeader), $FF);
    F.Read(Buffer, SizeOf(TUnionFileHeader));
    with Buffer do
      if bfType = $4D42 then
      begin
        if (bfSize = DWORD(F.Size)) and (bfReserved1 = 0) and
           (bfReserved2 = 0) then
          Result := itBitmap;
      end else begin
        if (Code_1 = #$FF#$D8#$FF#$E0) and (Code_2 = 'JFIF') then
          Result := itJpeg;
      end;
  finally
    F.Free;
  end;
end;

procedure LoadPicture(const FileName: String; Picture: TPicture);
//画像を読み込む(バイナリチェック付)
var
  G: TGraphic;
begin
  try
    Picture.LoadFromFile(FileName);
  except
    on E: EInvalidGraphic do
    begin
      case GetGraphicFormat(FileName) of
        itBitmap:G := TBitmap.Create;
        itJpeg  :G := TJPEGImage.Create;
      else
        raise EInvalidGraphic.Create('未対応の画像フォーマットです。');
      end;
      try
        G.LoadFromFile(FileName);
        Picture.Assign(G);
      finally
        G.Free;
      end;
    end;
  end;
end;

Copyright 2001 Rinka Kouzuki All Rights Reserved.