Ein Bild in schwarz weiß speichern und vergleichen

  • Hallo zusammen,

    ich habe ein Webcam script bei dem ich so:
    Func SnapShot()
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_GRAB_FRAME_NOSTOP, "int", 0, "int", 0)
    DllCall($user, "int", "SendMessage", "hWnd", $cap[0], "int", $WM_CAP_FILE_SAVEDIBA, "int", 0, "str", $snapfile)
    EndFunc

    einen snapshot mache kann mir jemand sagen wie ich das bild in monochromfarben mache damit ich es anschließend leichter vergleichen kann.
    ich habe in der Hilfe das hier gefunden $LR_MONOCHROME - Lädt das Image monochrom (Schwarz/Weiß) jedoch weiß ich nicht wie es mit der
    snapshot funktion nutzen kann.

  • Hab das aus dem englischen Forum und so angepasst, das es SW-Bilder ausgibt:

    SW-Maker.au3
    [autoit]

    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <Color.au3>
    #include <WinAPI.au3>

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

    $PATH = FileOpenDialog("Datei auswählen",@ScriptDir,"Bilder (*.bmp; *.jpg)",1)
    If @error Then Exit
    $CHOOSE = GUICreate("Wählen",100,60,-1,-1,0x16C80000)
    $COMBO = GUICtrlCreateCombo("",5,5,90,20)
    GUICtrlSetData($COMBO,"Rot-Anteil|Grün-Anteil|Blau-Anteil","Rot-Anteil")
    $SELECT = GUICtrlCreateButton("OK",5,30,90,20)
    GUISetState(@SW_SHOW,$CHOOSE)
    While 1
    $MSG = GUIGetMsg()
    If $MSG = $SELECT Then
    $CHANNEL = GUICtrlRead($COMBO)
    GUIDelete($CHOOSE)
    ExitLoop
    ElseIf $MSG = -3 Then
    Exit
    EndIf
    Sleep(15)
    WEnd

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

    $SAVE = FileSaveDialog("Speichern",@ScriptDir,"Bild (*.jpg)",16,"Bitmap_" & $CHANNEL & ".JPG")
    If @error Then
    Exit
    Else
    If StringRight($SAVE, 4) <> ".JPG" Then $SAVE &= ".JPG"
    EndIf

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

    _GDIPlus_Startup()
    $IMAGE = _GDIPlus_ImageLoadFromFile($PATH)
    $X = _GDIPlus_ImageGetWidth($IMAGE)
    $Y = _GDIPlus_ImageGetHeight($IMAGE)
    _GDIPlus_ImageDispose($IMAGE)

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

    $GUI = GUICreate("SW-Maker",$X,$Y,-1,-1,0x80000000)
    GUISetBkColor(0xFFFFFF)
    $PICTURE = GUICtrlCreatePic($PATH,0,0,$X,$Y)
    GUISetState(@SW_SHOW,$GUI)

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

    $DC = _WinAPI_GetDC($GUI)
    $C_DC = _WinAPI_CreateCompatibleDC($DC)
    $BITMAP = _WinAPI_CreateCompatibleBitmap($DC,$X,$Y)
    _WinAPI_SelectObject($C_DC,$BITMAP)
    _WinAPI_BitBlt ($C_DC,0,0,$X,$Y,$DC,0,0,$SRCCOPY)
    $BITS = DllStructCreate ("dword[" & ($X * $Y) & "]")
    DllCall ("gdi32", "int", "GetBitmapBits", "ptr", $BITMAP, "int", ($X * $Y * 4), "ptr", DllStructGetPtr ($BITS))
    GUICtrlDelete($PICTURE)

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

    For $CY = 0 To ($Y - 1)
    For $CX = 0 To ($X - 1)
    $INDEX = ($CY * $X) + $CX
    $COLOR = DllStructGetData ($BITS,1, $INDEX)
    $RED = Hex(_ColorGetRed($COLOR),2)
    $GREEN = Hex(_ColorGetGreen($COLOR),2)
    $BLUE = Hex(_ColorGetBlue($COLOR),2)
    If $CHANNEL = "Rot-Anteil" Then
    $COLOR = "0x" &$RED&$RED&$RED
    ElseIf $CHANNEL = "Grün-Anteil" Then
    $COLOR = "0x"&$GREEN&$GREEN&$GREEN
    ElseIf $CHANNEL = "Blau-Anteil" Then
    $COLOR = "0x"&$BLUE&$BLUE&$BLUE
    EndIf
    DllStructSetData ($BITS,1,$COLOR,$INDEX)
    Next
    DllCall ("gdi32", "int", "SetBitmapBits", "ptr", $BITMAP, "int", ($X * $Y * 4), "ptr", DllStructGetPtr ($BITS))
    _WinAPI_BitBlt ($DC,0,0,$X,$Y,$C_DC,0,0,$SRCCOPY)
    Next
    $HIMAGE = _GDIPlus_BitmapCreateFromHBITMAP($BITMAP)
    _GDIPlus_ImageSaveToFile($HIMAGE,$SAVE)
    _WinAPI_DeleteObject($HIMAGE)
    _WinAPI_DeleteObject($BITMAP)
    _GDIPlus_Shutdown()
    _WinAPI_ReleaseDC($GUI,$DC)

    [/autoit]