-
Подскажите, полажуйста, как не открывая jpg и bmp файла определить высоту и ширину картинки в пикселях? Заранее спасибо.
-
> [0] Jimmy (27.08.07 01:04) > как не открывая jpg и bmp файла определить высоту и ширину > картинки в пикселях
В любом случае - никак :) А вот открыть и не загружая весь файл, а считать размер из заголовка файла, возможно и можно, но я не знаю.... Смотри форматы данных файлов.... может и найдешь ответ сам....
-
-
Только чтением информации из сигнатур, насколько я знаю, для каждого формата сигнатуры свои). s7r подсказывает абсолютно правильно.
-
-
Тут уже ответили, но всеже. Достаточно читать заголовок файла. Это не сложно, только он у каждого формата свой. Например в классическом BMP Ширина и Высота - 4 байтовые целочисленное беззнаковое и находиться соответственно на смещении 18 и 22
-
мда, вопрос читается, как арахисовый ^^'
-
function ReadMWord(f: TFileStream): word; type TMotorolaWord = record case byte of 0: (Value: word); 1: (Byte1, Byte2: byte); end; var MW: TMotorolaWord; begin { It would probably be better to just read these two bytes in normally } { and then do a small ASM routine to swap them. But we aren't talking } { about reading entire files, so I doubt the performance gain would be } { worth the trouble.} 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); { don't need these bytes } 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; { Fake it to keep looping. } end; end; end; end; finally f.Free; end; end;
Это процедура для определения размера (высота, ширина) JPG файла. Что здесь надо изменить, учитывая, что для bmp смещение 18 и 22, чтобы она работала для bmp?
-
> f := TFileStream.Create(sFile, fmOpenRead);
это называется "не открывая jpg и bmp файла"?
-
|