Bei dem was ich auf die schnelle recherchiert habe kommt ein fast gleiches Snippet bei raus.
Wie Luckie bereits schrieb, den Magic Bytes jede Menge beachtung schenken, weswegen dieses Snippet noch ausbaufähig ist.
Geschwindigkeit scheint mir mit beiden Versuchen auf gleicher Höhe zu liegen.
Delphi-Quellcode:
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;
Quelle:
get-width-and-height-of-jpg-image.html