Hmm..
Hab mir die letzte Version angeschaut..
Wieso gehst Du erst den kompletten Header durch, um dann wieder von vorne anzufangen, um nur die Pakete mit $C0 bis $C2 zu suchen.
Das lesen der Größe gibt bei mir bei einigen Bildern auch eine falsche Größe wieder...
Deshalb habe ich das mal aufgeräumt und überarbeitet:
Delphi-Quellcode:
type
TByteArr = array of Byte;
TJFIFSegment = packed record
Fix : Byte;
Kind : Byte;
end;
… gekürzt... (weiter oben im Thread komplett)
Das funktioniert nun auch mit den anders kodierten JPGs ($C3,$C9..) und liefert schnell die richtige Größe zurück.
(Außerdem ist es meiner Meinung nach besser lesbar
)
Das muss ich wohl bei mir noch $C9 dazu machen.
Wie findest du denn meine (bzw. eine gefundene von mir abgeänderte Version)? (hier im Thread irgendwo auch weiter oben; aber füge sie mal unten hinzu) Abgesehen vom "besser lesbarem". Hab sie halt gekürzt.
Ich verstehe aber noch nicht so ganz den While Block. Also der Bereich " If Not (BD In [$01,$D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7])" Bin mir da nicht so ganz klar, wie viel/lange er liest. Geht aber jedenfalls gut und schnell. Auch noch keine JPG gefunden, die hier falsche Werte (Breite/Höhe) liefert.
Delphi-Quellcode:
Procedure GetJPGSize(sFile: String; Out WW, WH: DWord);
Var
FS: TFileStream;
BD: Byte;
WD : Word;
RL: LongInt;
HW : Array[0..3] Of Byte;
LE : Array[0..1] Of Byte;
Begin
sFile := '\\?\'+SFile;
WW := 0;
WH := 0;
FS := TFileStream.Create(sFile, fmShareDenyNone);
Try
RL := FS.Read(WD, 2);
If (Lo(WD) <> $FF) And (Hi(WD) <> $D8) Then RL := 0;
If RL > 0 Then
Begin
RL := FS.Read(BD, 1);
While (BD = $FF) and (RL > 0) Do
Begin
RL := FS.Read(BD, 1);
If BD <> $FF Then
Begin
If BD In [$C0,$C1,$C2] Then
Begin
FS.Seek(3,1);
FS.Read(HW,4);
WH := HW[0] Shl 8 + HW[1];
WW := HW[2] Shl 8 + HW[3];
End Else
Begin
If Not (BD In [$01,$D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7]) Then
Begin
FS.Read(Le,2);
WD := LE[0] Shl 8 + Le[1];
FS.Seek(WD - 2, 1);
FS.Read(BD, 1);
End Else BD := $FF;
End;
End;
End;
End;
Finally
FS.Free;
End;
End;