Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как определить размер изображения в файле?


Автор: Первый 7.4.2003, 14:32
Есть файл-раисунок. Нужно определить рамеры изображения, находящегося в нём.

Автор: <Spawn> 7.4.2003, 17:34
Может SizeOf или FileSize?

Автор: stab 7.4.2003, 17:36
<Spawn> да не имеется в виду высота, ширина картинки...

Автор: stab 7.4.2003, 17:37
2 Первый а что за фомат картиник? bmp, jpg, gif...

Автор: Song 7.4.2003, 20:46
Width/Height

Автор: Vit 7.4.2003, 23:45
Зависит от формата картинки

Автор: man2002ua 8.4.2003, 12:01
// для *.bmp

var bmp: TBitmap;
begin
bmp := TBitmap.Create;
bmp.LoadFromFile('c:\file.bmp');
MessageDlg('Width='+inttostr(bmp.Width)+#13+'Height='+inttostr(bmp.Height),
mtConfirmation,[mbok],0);
end;

Автор: stab 8.4.2003, 17:37
2 man2002ua тут наверно вся фишка вопроса в том, что б не загружаю картинку узнать размер smile.gif и это просто:

Код

function GetBMPDimensions(fn: String): TPoint;
var
 fs: TFileStream;
begin
 fs := TFileStream.Create(fn, fmOpenRead);
 fs.Position := $12;
 fs.Read(Result, SizeOf(Result));
 fs.Free;
end;

function GetGIFDimensions(fn: String): TPoint;
var
 fs: TFileStream;
 pt: TSmallPoint;
begin
 fs := TFileStream.Create(fn, fmOpenRead);
 fs.Position := $6;
 fs.Read(pt, SizeOf(pt));
 fs.Free;
 Result.X := pt.x;
 Result.Y := pt.y;
end;

function GetJPEGDimensions(fn: String): TPoint;
var
 fs: TFileStream;
 pt: TSmallPoint;

 function NextMarker: Byte;
 var
   b: Byte;
 begin
   Result := 0;
   while True do begin
     repeat
       fs.Read(b, SizeOf(b));
     until b = $FF;

     repeat
       fs.Read(b, SizeOf(b));
     until b <> $FF;

     if b <> 0 then begin
       Result := b;
       Break;
     end;
   end;
 end;

begin
 fs := TFileStream.Create(fn, fmOpenRead);
 while not (NextMarker in [$C0..$CF]) do;
 fs.Seek(3, soFromCurrent);
 fs.Read(pt, SizeOf(pt));
 fs.Free;

 pt.x := ((pt.x and $00FF) shl 8) or ((pt.x and $FF00) shr 8);
 pt.y := ((pt.y and $00FF) shl 8) or ((pt.y and $FF00) shr 8);

 Result.X := pt.y;
 Result.Y := pt.x;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 pt: TPoint;
begin
 pt := GetBMPDimensions('c:\test.bmp');
 ShowMessage('BMP: ' + IntToStr(pt.X) + ', ' + IntToStr(pt.Y));

 pt := GetGIFDimensions('c:\test.gif');
 ShowMessage('GIF: ' + IntToStr(pt.X) + ', ' + IntToStr(pt.Y));

 pt := GetJPEGDimensions('c:\test.jpg');
 ShowMessage('JPEG: ' + IntToStr(pt.X) + ', ' + IntToStr(pt.Y));
end;


не лучшая реализация с точки зрения понятности, надо бы все константы обозвать, структуры оформить и т.д. , но работает smile.gif

Автор: man2002ua 9.4.2003, 09:35
Ну да, это если не лень вспоминать форматы файлов wink.gif

Автор: stab 10.4.2003, 09:25
man2002ua надо описалово всегда хранить под рукой, как можно большего кол-ва форматов всего на свете, тогда и вспоминать не надо smile.gif

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