Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > структура jpg


Автор: 14SatanA88 9.9.2011, 16:13
Доброго времени суток, уважаемые программеры.

Пытаюсь считать размеры jpg файла. Это что-то вроде лабы, так что пользоваться уже созданными для работы с изображениями модулями нельзя.

Вот весь код:
Код

procedure TMainForm.btnJPGClick(Sender: TObject);
type JPGInfoHeader = packed record
    jpgWidth: WORD;
    jpgHeight: WORD;
    end;
var jpgMagic_l, jpgMagic_h: BYTE;
    fJPG: file of byte;
    bJPG: byte;
    buf: array[1..64] of byte;
    jpgfi: ^JPGInfoHeader;
    p: pointer;
begin

  // set filter on dialog
  OpenDialog.Filter:='JPG|*.jpg';

  // opening file
  if OpenDialog.Execute then
  begin
    imgJPG.Picture.LoadFromFile(OpenDialog.FileName);
    editJPG.Text:=OpenDialog.FileName;
    AssignFile(fJPG,OpenDialog.FileName);
    Reset(fJPG);
    memoJPG.Clear;
    // output
    Read(fJPG,jpgMagic_l);
    Read(fJPG,jpgMagic_h);
    memoJPG.Lines.Add('signature = '+inttohex(jpgMagic_l,2)+' '+inttohex(jpgMagic_h,2));
    while not eof(fJPG) do
    begin
      Read(fJPG,bJPG);
      if bJPG=$FF then
      begin
        Read(fJPG,bJPG);
        if ((bJPG=$C0) or (bJPG=$C2)) then
        begin
          BlockRead(fJPG,buf,sizeof(JPGInfoHeader));
          p:=@buf;
          memoJPG.Lines.Add('width = '+inttostr(jpgfi^.jpgWidth));
          memoJPG.Lines.Add('height = '+inttostr(jpgfi^.jpgHeight));
          exit;
        end;
      end;
    end;
    // end
    CloseFile(fJPG); 
  end;

end;


Насколько я понял, надо найти маркер 0xFFC0 или 0xFFC2, потому что там начинается секция с нужной мне инфой (ширина, высота)
Я делаю это так:
Код

    while not eof(fJPG) do
    begin
      Read(fJPG,bJPG);
      if bJPG=$FF then
      begin
        Read(fJPG,bJPG);
        if ((bJPG=$C0) or (bJPG=$C2)) then
        begin
          BlockRead(fJPG,buf,sizeof(JPGInfoHeader));
          p:=@buf;
          memoJPG.Lines.Add('width = '+inttostr(jpgfi^.jpgWidth));
          memoJPG.Lines.Add('height = '+inttostr(jpgfi^.jpgHeight));
          exit;
        end;
      end;
    end;


но эти строки
memoJPG.Lines.Add('width = '+inttostr(jpgfi^.jpgWidth));
memoJPG.Lines.Add('height = '+inttostr(jpgfi^.jpgHeight));
дают неправильный результат.

вопрос: что я делаю не так? как получить из jpg инфу, которая описана в http://afruj.wordpress.com/2008/08/01/image-file-header-formats/

Автор: 14SatanA88 14.9.2011, 11:06
что, неужели никто не потрошил jpg?

Автор: AndreyIQ 14.9.2011, 11:25
Цитата(14SatanA88 @ 14.9.2011,  11:06)
что, неужели никто не потрошил jpg?

Если чесно лень разбираться, но судя по http://forum.vingrad.ru/index.php?showtopic=199627&view=findpost&p=1435676 описанию, Вы не правильно читаете.

Автор: 14SatanA88 14.9.2011, 13:46
AndreyIQ, спасибо, там ценная инфа

Автор: Alexeis 14.9.2011, 14:41
Угу, там в теме есть ссылка на вот эту тему http://forum.vingrad.ru/forum/topic-105564.html где как раз есть полный кода для получения размеров жпеги. Это вариант ТС, но доведенный до ума.

Автор: 14SatanA88 15.9.2011, 08:05
Alexeis, когда я завел тему, думал, что на маркере SOFx первая инфа - это размер изображения.
я ошибался. просто учел смещение. 

всем спасибо, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)