Get the width and height of a *.jpg image without using a TJPEGImage (Views: 706)
Problem/Question/Abstract: Is there a way to get a Jpeg's height and width without using TJPEGImage? I have over 10000 images that have to be verified each month and using TJPEGImage.LoadFromFile to get the Height and Width is too slow. Answer: This might not work with all sorts of *.jpg images: function GetJpegSize(const FileName: string): TPoint; var fs: TFileStream; SegmentPos: Integer; SOIcount: Integer; x, y: word; b: byte; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); try fs.Position := 0; fs.Read(x, 2); if x <> $D8FF then raise Exception.Create('Not a Jpeg file'); SOIcount := 0; fs.Position := 0; while fs.Position + 7 < fs.Size do begin fs.Read(b, 1); if b = $FF then begin fs.Read(b, 1); if b = $D8 then Inc(SOIcount); if b = $DA then Break; end; end; if b <> $DA then raise Exception.Create('Corrupt Jpeg file'); SegmentPos := -1; fs.Position := 0; while fs.Position + 7 < fs.Size do begin fs.Read(b, 1); if b = $FF then begin fs.Read(b, 1); if b in [$C0, $C1, $C2] then begin SegmentPos := fs.Position; Dec(SOIcount); if SOIcount = 0 then Break; end; end; end; if SegmentPos = -1 then raise Exception.Create('Corrupt Jpeg file'); if fs.Position + 7 > fs.Size then raise Exception.Create('Corrupt Jpeg file'); fs.Position := SegmentPos + 3; fs.Read(y, 2); fs.Read(x, 2); Result := Point(Swap(x), Swap(y)); finally fs.Free; end; end; |