Определить формат изображения, загруженного в TMemoryStream

Материал из DRKB


type
  TImageType = (NoImage, Bmp, Gif, Gif89, Png, Jpg);

function KindOfImage(Start: Pointer): TImageType;
type
  ByteArray = array[0..10] of Byte;
var
  PB: ^ByteArray absolute Start;
  PW: ^Word absolute Start;
  PL: ^DWord absolute Start;
begin
if PL^ = $38464947 then
  begin
    if PB^[4] = Ord('9') then
      Result := TImageType.Gif89
    else
      Result := TImageType.Gif;
  end
  else if PW^ = $4D42 then
    Result := TImageType.Bmp
  else if PL^ = $474E5089 then
    Result := TImageType.Png
  else if PW^ = $D8FF then
    Result := TImageType.Jpg
  else
    Result := TImageType.NoImage;
end;


Пользоваться можно так:

case KindOfImage(MemoryStream.Memory) of
...


Для тех, кого смущает absolute:

type
  TImageType = (NoImage, Bmp, Gif, Gif89, Png, Jpg);

function KindOfImage(Start: Pointer): TImageType;
begin
  if LongWord(Start^) = $38464947 then
  begin
    if (PChar(Start) + 4)^ = '9' then
      Result := TImageType.Gif89
    else
      Result := TImageType.Gif;
  end
  else if Word(Start^) = $4D42 then
    Result := TImageType.Bmp
  else if LongWord(Start^) = $474E5089 then
    Result := TImageType.Png
  else if Word(Start^) = $D8FF then
    Result := TImageType.Jpg
  else
    Result := TImageType.NoImage;
end;


Author: s-mike
Source: http://forum.sources.ru
ID: 03631
ID: 03633