JPEG - Farbtiefe, Höhe, Breite und Farbraum ermitteln

  • 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
    [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; #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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]