{ Copyright Kingron 2002 } function GetJPEGSize(FileName: string; var Width, Height: WORD): Boolean; const JPEG_FLAG_BEGIN = $D8FF; JPEG_FLAG_END = $D9FF; JPEG_FRAME = $C0FF; var FS: TFileStream; Flag1, Flag2: WORD; B: Byte; procedure SeekForFrame; type TSegHeader = packed record Flag: WORD; LenHi, LenL Byte; end; var Seg: TSegHeader; begin with Seg, FS do repeat Read(Seg, SizeOf(Seg)); if Flag <> JPEG_FRAME then Position := Position + MakeWord(LenLo, LenHi) - 2; until (Position >= Fs.Size) or (Seg.Flag = JPEG_FRAME); end; begin FS := TFileStream.Create(FileName, fmOpenRead); try { JPEG 文件開頭必須為 FF D8,文件尾必須為 FF D9 } FS.Read(Flag1, SizeOf(Flag1)); FS.Position := FS.Size - 2; FS.Read(Flag2, SizeOf(Flag2)); result := (Flag1 = JPEG_FLAG_BEGIN) and (Flag2 = JPEG_FLAG_END); if not result then exit; { 不是合法的JPEG文件則退出 } FS.Position := 2; SeekForFrame; { 尋找JPEG的Frame段,即圖像數據區(qū) } FS.Read(B, SizeOf(B)); { Frame段段頭后第一個Byte為數據精度 } FS.Read(B, SizeOf(B)); { 高度高字節(jié) } WordRec(Height).Hi := B; FS.Read(B, SizeOf(B)); { 高度低字節(jié) } WordRec(Height).Lo := B; FS.Read(B, SizeOf(B)); { 寬度高字節(jié) } WordRec(Width).Hi := B; FS.Read(B, SizeOf(B)); { 寬度低字節(jié) } WordRec(Width).Lo := B; finally FS.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var W, H: Word; begin with OpenDialog1 do if Execute then if GetJPEGSize(FileName, W, H) then Caption := Format('Yes,W:%d,H:%d', [W, H]) else Caption := 'No'; end; //該代碼片段來自于: http://www./codes/delphi/8989 |
|