Bei der Entwicklung von AuPDF ist eine kleine Funktion entstanden, mit der man Farbtiefe, Höhe, Breite und Farbraum einer JPEG-Datei auslesen kann.
Vllt. braucht es ja irgendwann mal jemand...
Spoiler anzeigen
Local $aData = _JPEG_GetData("PDF.jpg")
If @error Then
MsgBox(0, "Fehler", @error)
Else
MsgBox(0, "Daten", "Farbtiefe: " & $aData[0] & @lf & "Höhe: " & $aData[1] & @lf & "Breite: " & $aData[2] & @lf & "Farbraum: " & $aData[3])
EndIf
; #FUNCTION# ====================================================================================================================
; Name...........: _JPEG_GetData
; Description ...: Ermittelt Farbtiefe, Höhe, Breite und Farbraum einer JPEG-Datei.
; Syntax.........: _JPEG_GetData($sFile)
; Parameters ....: $sFile - Pfad und Dateiname des Bildes.
; Return values .: Success - array[0]: Farbtiefe
; - array[1]: Höhe
; - array[2]: Breite
; - array[3]: Farbraum
; Failure - @error 1: Konnte Datei nicht öffnen.
; - @error 2: Signatur Fehlerhaft. Falsches Dateiformat?
; - @error 3: Frameheader fehlt.
; - @error 4: Unbekannter Block.
; - @error 5: Unerwartetes Dateiende.
; Author ........: Christian Korittke (Ahnungslos)
; Modified.......:
; Remarks .......: Farbraum - 1 Graustufen
; - 3 RGB
; - 4 CMYK
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _JPEG_GetData($sFile)
Local $hFile = FileOpen($sFile, 16)
If @error Then SetError(1, 0, -1)
If FileRead($hFile, 2) <> 0xD8FF Then Return SetError(2, FileClose($hFile), -1) ; no jpeg signature
While FileRead($hFile, 1) = 0xFF
Switch FileRead($hFile, 1)
Case 0xD0 To 0xD9 ; empty block
FileSetPos($hFile, 1, 1) ; skip 1 byte
Case 0xC0 To 0xC3, 0xC5 To 0xC7, 0xC9 To 0xCB, 0xCD To 0xCF ; frame header
FileSetPos($hFile, 2, 1) ; skip 2 bytes
Local $aImage[4]
$aImage[0] = Int(FileRead($hFile, 1)) ; color depth
$aImage[1] = Int(BitRotate(FileRead($hFile, 2), 8)) ; height ; big to little endian
$aImage[2] = Int(BitRotate(FileRead($hFile, 2), 8)) ; width ; big to little endian
$aImage[3] = Int(FileRead($hFile, 1)) ; color space
Return $aImage
Case 0xDB To 0xFE ; other stuff
FileSetPos($hFile, Int(BitRotate(FileRead($hFile, 2), 8)) - 2, 1) ; skip block ; big to little endian
Case 0xDA ; image start
Return SetError(3, FileClose($hFile), -1) ; miss frame header
Case Else ; error
Return SetError(4, FileClose($hFile), -1) ; unknow block type
EndSwitch
WEnd
Return SetError(5, FileClose($hFile), -1) ; eof
EndFunc