Ungefähr sowas:
Delphi-Quellcode:
function GetIsJPG(fFilename : String) : Boolean;
var
Buffer : packed array[0 .. 9] of Byte;
BytesRead : DWORD;
fFileHandle : THandle
begin
fFileHandle := CreateFile(PAnsiChar(fFileName),
GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, 0, 0);
Result := fFileHandle <> INVALID_HANDLE_VALUE;
if Result then begin
FillChar(Buffer, SizeOf(Buffer), 0);
SetFilePointer(fFileHandle, 0, nil, FILE_BEGIN);
Result := ReadFile(fFileHandle, Buffer, SizeOf(Buffer), BytesRead, nil)
and (BytesRead >= SizeOf(Buffer))
and (
((Buffer[0] = $FF) and (Buffer[1] = $D8) and (Buffer[2] = $FF))
or
((Buffer[6] = $4A) and (Buffer[7] = $46) and (Buffer[8] = $49) and (Buffer[9] = $46))
);
end;
end;
Ob die Prüfung vollständig ist, weiß ich nicht, aber seitdem ich das nutze, bekomme ich den Fehler #53 nicht mehr zu sehen.
Die Dateiendung ist nicht zuverlässig, im Web findet man etliche JPG-Dateien (zumindest der Dateiendung nach) die in Wirklichkeit PNGs sind.
Bei 'nem Stream musst Du die Abfrage entsprechend anpassen, es sind die Bytes 0 bis 2 bzw. 6 bis 9 zu prüfen. Damit ist man eigentlich recht zuverlässig in der Erkennung.