Hi Ben

I have done some simple image type detection in my xeEngine that I am writing for The Probe...

here is that part of the code if you want to try it (seems to work for me):

Code:
type
  TImageType = (itUnknown,itBMP,itPNG,itTGA);

function  GetImageTypeFromStream(Stream: TStream): TImageType;
type
  TTGAHeader = packed record   // Header type for TGA images
    FileType     : Byte;
    ColorMapType : Byte;
    ImageType    : Byte;
    ColorMapSpec : Array[0..4] of Byte;
    OrigX  : Array [0..1] of Byte;
    OrigY  : Array [0..1] of Byte;
    Width  : Array [0..1] of Byte;
    Height : Array [0..1] of Byte;
    BPP    : Byte;
    ImageInfo : Byte;
  end;

const
  cBMPSig = $4d42;
  cPNGSig: array[0..7] of Byte = (137, 80, 78, 71, 13, 10, 26, 10);
var
  BMPSig   : Word;
  PNGSig   : array[0..7] of Byte;
  TGAHeader: TTGAHeader;
  i        : Integer;
  OldPos   : Int64;
  Image    : AnsiString;
begin
  Result := itUnknown;

  OldPos := Stream.Position;
  try
    // check for BMP
    Stream.Read(BMPSig, SizeOf(BMPSig));
    if BMPSig = cBMPSig then
    begin
      Result := itBMP;
      Exit;
    end;

    //check for PNG
    Result := itPNG;
    Stream.Seek(OldPos,soFromBeginning);
    Stream.Read(PNGSig,SizeOf(PNGSig));
    for i := 0 to 7 do
    begin
      if PNGSig[i] <> cPNGSig[i] then
      begin
        Result := itUnknown;
        Break;
      end;
    end;

    if Result = itPNG then Exit;

    Result := itUnknown;

    //check for TGA
    Stream.Seek(OldPos,soFromBeginning);
    Stream.Read(TGAHeader,SizeOf(TGAHeader));

    // Only support 24, 32 bit images
    if (TGAHeader.ImageType <> 2) and    { TGA_RGB }
       (TGAHeader.ImageType <> 10) then  { Compressed RGB }
    begin
      Exit;
    end;

    // Don't support colormapped files
    if TGAHeader.ColorMapType <> 0 then
    begin
      Exit;
    end;

    Result := itTGA;
  finally
    Stream.Seek(OldPos,soFromBeginning);
  end;
end;
Using it:
Code:
function  TImageBuffer32.LoadFromStream(Stream: TStream): Boolean;
var
  ImgType: TImageType;
begin
  Result := False;

  ImgType := GetImageTypeFromStream(Stream);

  case ImgType of
    itBMP : Result :=  LoadBMPFromStream(Stream,Self);
    itPNG : Result :=  LoadPNGFromStream(Stream,Self);
    itTGA : Result :=  LoadTGAFromStream(Stream,Self);
  else
  end;
end;
cheers,
Paul