본문 바로가기

프로그래밍/Delphi

이미지 타입 얻기 통합모듈

개요 

  잘 알려진 이미지 파일 및 스트림을 이용해 이미지 타입을 얻는 모듈입니다. 


이미지 소스타입 얻기 라이브러리


const
  JPG_HEADER: array[0..2] of byte = ($FF, $D8, $FF);
  GIF_HEADER: array[0..2] of byte = ($47, $49, $46);
  BMP_HEADER: array[0..1] of byte = ($42, $4D);
  PNG_HEADER: array[0..3] of byte = ($89, $50, $4E, $47);
  TIF_HEADER: array[0..2] of byte = ($49, $49, $2A);

type
  TImageType = (ifUnknown, ifJPG, ifGIF, ifBMP, ifPNG, ifTIF);

...

function GetImageType(ImageStream : TMemoryStream): TImageType;
begin
  Result := ifUnknown;
  try
    if ImageStream.Size > 4 then
    begin
      if CompareMem(ImageStream.Memory, @JPG_HEADER, SizeOf(JPG_HEADER)) then
        Result := ifJPG
      else if CompareMem(ImageStream.Memory, @GIF_HEADER, SizeOf(GIF_HEADER)) then
        Result := ifGIF
      else if CompareMem(ImageStream.Memory, @PNG_HEADER, SizeOf(PNG_HEADER)) then
        Result := ifPNG
      else if CompareMem(ImageStream.Memory, @BMP_HEADER, SizeOf(BMP_HEADER)) then
        Result := ifBMP
      else if CompareMem(ImageStream.Memory, @TIF_HEADER, SizeOf(TIF_HEADER)) then
        Result := ifTIF;
    end;
  finally
  end;
end;

function GetImageType(FileName: String): TImageType;
var
  Stream: TFileStream;
  MemStr: TMemoryStream;
begin
  Result := ifUnknown;
  Stream := TFileStream.Create(FileName, fmOpenRead);
  MemStr := TMemoryStream.Create;
  try
    MemStr.CopyFrom(Stream, 5);
    Result := GetImageType(MemStr);
  finally
    Stream.Free;
    MemStr.Free;
  end;
end;

function ImageTypeToStr(ImageType: TImageType): String;
begin
  case ImageType of
    ifJPG: Result := 'Image/JPEG';
    ifGIF: Result := 'Image/GIF';
    ifPNG: Result := 'Image/PNG';
    ifBMP: Result := 'Image/BMP';
    ifTIF: Result := 'Image/TIFF';
  else
    Result := 'Unknown Type';
  end;
end;


이미지 소스타입 얻기 테스트

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, pngimage, jpeg, StdCtrls, ExtDlgs, ImageUtils;

type
  TfrmMain = class(TForm)
    OpenPictureDialog1: TOpenPictureDialog;
    btnTestGetImageType: TButton;
    procedure btnTestGetImageTypeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.btnTestGetImageTypeClick(Sender: TObject);
var
  rlt : TImageType;
begin
  if OpenPictureDialog1.Execute then
  begin
    rlt := GetImageType(OpenPictureDialog1.FileName);
    ShowMessage(ImageTypeToStr(rlt));
  end;
end;

end.