2010. január 30., szombat
Get the width and height of a *.jpg image without using a TJPEGImage
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;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése