UDF > WinAPIEx > GDI > Colors >


_WinAPI_CreateColorAdjustment

Cr�e la structure $tagCOLORADJUSTMENT qui sp�cifie l'ajustement des couleurs

#include <WinAPIGdi.au3>
_WinAPI_CreateColorAdjustment ( [$iFlags = 0 [, $iIlluminant = 0 [, $iGammaR = 10000 [, $iGammaG = 10000 [, $iGammaB = 10000 [, $iBlack = 0 [, $iWhite = 10000 [, $iContrast = 0 [, $iBrightness = 0 [, $iColorfulness = 0 [, $iTint = 0]]]]]]]]]]] )

Param�tres

$iFlags [optionnel] Les flags qui sp�cifient comment l'image de sortie doit �tre pr�par�e. Ce param�tre peut �tre 0 ou une combinaison des valeurs suivantes:
    $CA_NEGATIVE
    $CA_LOG_FILTER
$iIlluminant [optionnel] Le type de source de lumi�re standard avec laquelle l'image est vue. Ce param�tre peut prendre une et une seule des valeurs suivantes:
    $ILLUMINANT_DEVICE_DEFAULT ( par d�faut )
    $ILLUMINANT_A
    $ILLUMINANT_B
    $ILLUMINANT_C
    $ILLUMINANT_D50
    $ILLUMINANT_D55
    $ILLUMINANT_D65
    $ILLUMINANT_D75
    $ILLUMINANT_F2
    $ILLUMINANT_TUNGSTEN
    $ILLUMINANT_DAYLIGHT
    $ILLUMINANT_FLUORESCENT
    $ILLUMINANT_NTSC
$iGammaR [optionnel] La force de la correction gamma pour le rouge primaire des couleurs d'origine.
La valeur doit �tre dans la plage de 2500 � 65000.
Une valeur de 10000 (valeur par d�faut) signifie pas de correction gamma.
$iGammaG [optionnel] La force de la correction gamma pour le vert primaire des couleurs d'origine.
La valeur doit �tre dans la plage de 2500 � 65000.
Une valeur de 10000 (valeur par d�faut) signifie pas de correction gamma.
$iGammaB [optionnel] La force de la correction gamma pour le bleu primaire des couleurs d'origine.
La valeur doit �tre dans la plage de 2500 � 65000.
Une valeur de 10000 (valeur par d�faut) signifie pas de correction gamma.
$iBlack [optionnel] La r�f�rence du noir pour les couleurs d'origine. Toutes les couleurs plus sombres que celle-ci sont trait�s en tant que noir.
La valeur doit �tre dans la plage de 0 � 4000.
Par d�faut, 0.
$iWhite [optionnel] La r�f�rence du blanc pour les couleurs d'origine. Toutes les couleurs qui sont plus claires que celle-ci sont trait�es en tant que blanc.
La valeur doit �tre comprise dans l'intervalle de 6000 � 10000.
Valeur par d�faut, 10000
$iContrast [optionnel] La quantit� de contraste � appliquer � l'objet source.
La valeur doit �tre dans la plage de -100 � 100.
Une valeur de 0 (valeur par d�faut) signifie aucun ajustement de contraste.
$iBrightness [optionnel] La quantit� de luminosit� � appliquer � l'objet source.
La valeur doit �tre dans la plage de -100 � 100.
Une valeur de 0 ( par d�faut ), aucun ajustement de la luminosit�.
$iColorfulness [optionnel] La quantit� de pl�nitude de couleur � appliquer � l'objet source.
La valeur doit �tre dans la plage de -100 � 100.
Une valeur de 0 (valeur par d�faut) signifie aucun ajustement de pl�nitude.
$iTint [optionnel] La quantit� de l'ajustement de la teinte rouge ou vert � appliquer � l'objet source.
La valeur doit �tre dans la plage de -100 � 100.
Les nombres positifs ajustent du cot� du rouge et n�gatifs ajustent du cot� du vert.
Une valeur de 0 (valeur par d�faut) signifie aucun ajustement de la teinte.

Valeur de retour

Retourne la structure $tagCOLORADJUSTMENT contenant les valeurs d'ajustement des couleurs.

Exemple

#include <APIGdiConstants.au3>
#include <APIResConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <SendMessage.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIHObj.au3>
#include <WinAPIShPath.au3>
#include <WindowsConstants.au3>

Opt('GUICloseOnESC', 0)
Opt('TrayAutoPause', 0)

Global $g_aDefault[11] = [10000, 10000, 10000, 0, 10000, 0, 0, 0, 0, 0, 0]
Global $g_aAdjust = $g_aDefault

_GDIPlus_Startup()

Global $sData, $hSrc, $W, $H
if Not GetImage($sData, $hSrc, $W, $H) Then Exit

; Cr�e une fen�tre pour l'image
Local $hForm = GUICreate(_WinAPI_PathStripPath($sData), $W, $H)
GUICtrlCreatePic('', 0, 0, $W, $H)
;GUICtrlSetState(-1, $GUI_DISABLE)
Local $hPic = GUICtrlGetHandle(-1)

; Cr�e une fen�tre d'outils
Global $g_hTool = GUICreate('Adjustments', 303, 484, 0, 0, BitOR($WS_CAPTION, $WS_POPUP), 0, $hForm)
GUICtrlCreateGraphic(0, 0, 303, 436)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlCreateGraphic(0, 436, 303, 1)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0xDFDFDF)

; Cr�e 9 contr�les Slider avec leur Label pour les diff�rents r�glages:
Global $g_aidSlider[9][6] = [[0, 0, 'Red', 25, 650, 100],[0, 0, 'Green', 25, 650, 100],[0, 0, 'Blue', 25, 650, 100],[0, 0, 'Black', 0, 400, 10],[0, 0, 'White', 600, 1000, 10],[0, 0, 'Contrast', -100, 100, 1],[0, 0, 'Brightness', -100, 100, 1],[0, 0, 'Colorfulness', -100, 100, 1],[0, 0, 'Tint', -100, 100, 1]]
For $i = 0 To 8
    GUICtrlCreateLabel($g_aidSlider[$i][2] & ':', 10, 21 + $i * 31, 60, 14, $SS_RIGHT)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $g_aidSlider[$i][2] = GUICtrlCreateInput('', 243, 18 + $i * 31, 49, 19, BitOR($ES_CENTER, $ES_READONLY))
    GUICtrlSetFont(-1, 9.3, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    $g_aidSlider[$i][0] = GUICtrlCreateSlider(71, 19 + $i * 31, 170, 20, BitOR($TBS_BOTH, $TBS_NOTICKS))
    GUICtrlSetLimit(-1, $g_aidSlider[$i][4], $g_aidSlider[$i][3])
    $g_aidSlider[$i][1] = GUICtrlGetHandle(-1)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
Next

; Puis un ComboBox
GUICtrlCreateLabel('Illuminant:', 10, 310, 60, 14, $SS_RIGHT)
GUICtrlSetBkColor(-1, 0xFFFFFF)
Global $g_idCombo = GUICtrlCreateCombo('', 77, 306, 158, 160, $CBS_DROPDOWNLIST)
Local $aLight = StringSplit('Default|Tungsten lamp|Noon sunlight|NTSC daylight|Normal print|Bond paper print|Standard daylight|Northern daylight|Cool white lamp', '|')
For $i = 1 To $aLight[0]
    _GUICtrlComboBox_AddString(-1, $aLight[$i])
Next

; Puis 4 contr�les CheckBox pour d'autres ajustements de l'image
GUICtrlCreateLabel('Filters:', 10, 347, 60, 14, $SS_RIGHT)
GUICtrlSetBkColor(-1, 0xFFFFFF)
Global $g_aidCheck[3]
$g_aidCheck[0] = GUICtrlCreateCheckbox('Negative (invert colors)', 77, 343, 131, 21)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$g_aidCheck[1] = GUICtrlCreateCheckbox('Logarithmic', 77, 368, 76, 21)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$g_aidCheck[2] = GUICtrlCreateCheckbox('Preview', 11, 401, 60, 21)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetState(-1, $GUI_CHECKED)

; Et enfin deux boutons Reset et Save
Local $aidButton[2]
$aidButton[0] = GUICtrlCreateButton('Reset', 136, 448, 75, 25)
$aidButton[1] = GUICtrlCreateButton('Save...', 218, 448, 75, 25)
_Reset()
GUICtrlSetState($g_aidSlider[0][0], $GUI_FOCUS)
GUIRegisterMsg($WM_HSCROLL, 'WM_HSCROLL')

; Affiche les fen�tres
GUISetState(@SW_SHOW, $hForm)
GUISetState(@SW_SHOW, $g_hTool)

; Pompe � message
Global $iMsg = GUIGetMsg()

While $iMsg <> $GUI_EVENT_CLOSE
    Switch $iMsg
        Case $aidButton[0]
            _Reset()

        Case $aidButton[1]
            GUISetState(@SW_DISABLE, $hForm)
            $sData = FileSaveDialog('Save Image', @WorkingDir, 'Image Files (*.bmp;*.dib;*.gif;*.jpg;*.tif)|All Files (*.*)', 2 + 16, @ScriptDir & '\MyImage.jpg', $g_hTool)
            GUICtrlSetState($aidButton[1], $GUI_FOCUS)
            GUISetState(@SW_ENABLE, $hForm)
            If $sData <> "" Then
                $hObj = _GDIPlus_BitmapCreateFromHBITMAP(_SendMessage($hPic, $STM_GETIMAGE))
                If $hObj Then
                    If _GDIPlus_ImageSaveToFile($hObj, $sData) Then
                        $sData = ""
                    EndIf
                    _GDIPlus_ImageDispose($hObj)
                EndIf

                If $sData <> "" Then
                    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', "Impossible de sauvegarder l'image.")
                EndIf
            EndIf

        Case $g_aidCheck[0]
            If GUICtrlRead($g_aidCheck[0]) = $GUI_CHECKED Then
                $g_aAdjust[9] = BitOR($g_aAdjust[9], $CA_NEGATIVE)
            Else
                $g_aAdjust[9] = BitAND($g_aAdjust[9], BitNOT($CA_NEGATIVE))
            EndIf
            _Update()

        Case $g_aidCheck[1]
            If GUICtrlRead($g_aidCheck[1]) = $GUI_CHECKED Then
                $g_aAdjust[9] = BitOR($g_aAdjust[9], $CA_LOG_FILTER)
            Else
                $g_aAdjust[9] = BitAND($g_aAdjust[9], BitNOT($CA_LOG_FILTER))
            EndIf
            _Update()

        Case $g_aidCheck[2]
            If GUICtrlRead($g_aidCheck[2]) = $GUI_CHECKED Then
                _SetBitmapAdjust($hPic, $hSrc, $g_aAdjust)
            Else
                _SetBitmapAdjust($hPic, $hSrc)
            EndIf

        Case $g_idCombo
            $sData = _GUICtrlComboBox_GetCurSel($g_idCombo)
            If $g_aAdjust[10] <> $sData Then
                $g_aAdjust[10] = $sData
                _Update()
            EndIf
    EndSwitch

    $iMsg = GUIGetMsg()
WEnd

; ==========================================================

func GetImage(byref $sData, byref $hSrc, byref $W, ByRef $H)
    ; Obtient une image: nom du fichier, handle, taille
    ; Retourne True si tout va bien, False sinon

    Local $hObj

    Do
        $hSrc = 0
        $sData = FileOpenDialog('Charge une image', @ScriptDir & '\Extras', 'Image Files (*.bmp;*.dib;*.gif;*.jpg;*.tif)|All Files (*.*)', 1 + 2)

        If @error Then Return False

        $hObj = _GDIPlus_ImageLoadFromFile($sData)

        If $hObj = 0 Then
            MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', "Impossible de charger l'image.")
        Else
            $hSrc = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hObj)
            $W = _GDIPlus_ImageGetWidth($hObj)
            $H = _GDIPlus_ImageGetHeight($hObj)
            _GDIPlus_ImageDispose($hObj)
        EndIf

    Until $hSrc <> 0

    Return True
EndFunc   ;==>GetImage

Func _Reset()
    ; R�initialise les contr�les � leur valeur par d�faut
    
    $g_aAdjust = $g_aDefault
    For $i = 0 To 8
        GUICtrlSetData($g_aidSlider[$i][0], $g_aAdjust[$i] / $g_aidSlider[$i][5])
        GUICtrlSetData($g_aidSlider[$i][2], $g_aAdjust[$i])
    Next
    _GUICtrlComboBox_SetCurSel($g_idCombo, $g_aAdjust[10])
    If BitAND($g_aAdjust[9], $CA_LOG_FILTER) Then
        GUICtrlSetState($g_aidCheck[1], $GUI_CHECKED)
    Else
        GUICtrlSetState($g_aidCheck[1], $GUI_UNCHECKED)
    EndIf
    If BitAND($g_aAdjust[9], $CA_NEGATIVE) Then
        GUICtrlSetState($g_aidCheck[0], $GUI_CHECKED)
    Else
        GUICtrlSetState($g_aidCheck[0], $GUI_UNCHECKED)
    EndIf
    _Update()
EndFunc   ;==>_Reset

Func _SetBitmapAdjust($hWnd, $hBitmap, $aAdjust = 0)
    ; Ajuste les couleurs de l'image
    
    If Not IsHWnd($hWnd) Then
        $hWnd = GUICtrlGetHandle($hWnd)
        If Not $hWnd Then
            Return 0
        EndIf
    EndIf

    Local $tAdjust = 0
    If IsArray($aAdjust) Then
        $tAdjust = _WinAPI_CreateColorAdjustment($aAdjust[9], $aAdjust[10], $aAdjust[0], $aAdjust[1], $aAdjust[2], $aAdjust[3], $aAdjust[4], $aAdjust[5], $aAdjust[6], $aAdjust[7], $aAdjust[8])
    EndIf
    $hBitmap = _WinAPI_AdjustBitmap($hBitmap, -1, -1, $HALFTONE, $tAdjust)
    If @error Then
        Return 0
    EndIf
    Local $hPrev = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
    If $hPrev Then
        _WinAPI_DeleteObject($hPrev)
    EndIf
    $hPrev = _SendMessage($hWnd, $STM_GETIMAGE)
    If $hPrev <> $hBitmap Then
        _WinAPI_DeleteObject($hBitmap)
    EndIf
    Return 1
EndFunc   ;==>_SetBitmapAdjust

Func _Update()
    If GUICtrlRead($g_aidCheck[2]) = $GUI_CHECKED Then
        _SetBitmapAdjust($hPic, $hSrc, $g_aAdjust)
    EndIf
EndFunc   ;==>_Update

Func WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam

    If $hWnd = $g_hTool Then
        Local $i = 0, $bIsFind = False
        While Not $bIsFind and $i < 9
            $bIsFind = ($g_aidSlider[$i][1] = $lParam)
            $i += 1
        WEnd

        If $bIsFind Then
            $i -= 1
            $g_aAdjust[$i] = $g_aidSlider[$i][5] * GUICtrlRead($g_aidSlider[$i][0])
            GUICtrlSetData($g_aidSlider[$i][2], $g_aAdjust[$i])
            _Update()
        EndIf
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_HSCROLL