Как узнать размеры JPG-файла?

При помощи данной процедуры на Delphi можно узнать высоту и ширину картинки, сохраненной в формате JPEG:

function ReadMWord (f: TFileStream): Word;
type
  TMotorolaWord = record
  case byte of
  0: (Value: Word);
  1: (Byte1, Byte2: Byte);
end;
var
  MW:TMotorolaWord;
begin
  f.Read(MW.Byte2, SizeOf(Byte));
  f.Read(MW.Byte1, SizeOf(Byte));
  Result := MW.Value;
end;

procedure GetJPGSize (const sFile:String; var wWidth, wHeight: Word);
const
  ValidSig: array[0..1] of byte = ($FF, $D8);
  Parameterless = [$01, $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7];
var
  Sig: array[0..1] of byte;
  f: TFileStream;
  x: Integer;
  Seg: Byte;
  Dummy: array[0..15] of Byte;
  Len: Word;
  ReadLen: LongInt;
begin
  FillChar(Sig, SizeOf(Sig), #0);
  f := TFileStream.Create(sFile, fmOpenRead);
  try
    ReadLen := f.Read(Sig[0], SizeOf(Sig));
    for x := Low(Sig) to High(Sig) do
      if (Sig[x] <> ValidSig[x]) then
        ReadLen := 0;
    if (ReadLen > 0) then
    begin
      ReadLen := f.Read(Seg, 1);
      while (Seg = $FF) and (ReadLen > 0) do
      begin
        ReadLen := f.Read(Seg, 1);
        if (Seg <> $FF) then
        begin
          if (Seg = $C0) or (Seg = $C1) then
          begin
            ReadLen := f.Read(Dummy[0], 3);
            wHeight := ReadMWord(f);
            wWidth := ReadMWord(f);
          end
          else
          begin
            if not (Seg in Parameterless) then
            begin
              Len := ReadMWord(f);
              f.Seek(Len - 2, 1);
              f.Read(Seg, 1);
            end
            else
              Seg := $FF;
        end;
      end;
    end;
  end;
  finally
    f.Free;
  end;
end;

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *