Jump to content
Sign in to follow this  
Malkey

Picture Effects (Swap, Add, Substract,Change ARGB with Color Matrix)

Recommended Posts

Malkey

Just play around with it. Discover how different matrices change an image. Or not.

#include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <EditConstants.au3>
    #include <ButtonConstants.au3>
    #include <Constants.au3>
    #include <misc.au3>
    
    ; Colour Matrix Reference Sites (some)
    ; http://www.codeproject.com/KB/GDI-plus/colormatrix.aspx
    ; http://boredzo.org/blog/archives/category/...hics/core-image
    ; http://www.reflectiveimages.com/digitalvelvia.htm
    ; http://www.imagemagick.org/Usage/color/
    ; http://blog.zacharcher.com/2007/10/
    ; Big Thanks Siao
    ;http://www.autoitscript.com/forum/index.php?s=&showtopic=69930&view=findpost&p=513472
    Opt("GUIOnEventMode", 0)
    Opt('MustDeclareVars', 1)
    HotKeySet("{ESC}", "Quit")
    Opt("GUICloseOnESC", 0)
    
    Global $dll = DllOpen("user32.dll")
    Global $iOpacity = 255
    Global Const $STM_SETIMAGE = 0x0172
    ;Local Const $ULW_ALPHA = 2
    ;Global Const $IMAGE_BITMAP = 0
    ;Global Const $WM_LBUTTONDOWN = 0x0201  ; Drag Window 1 of 3 addin
    Global $hBitmap, $hImage, $hImage1, $hGui1, $MatMenuChk = 0, $OrigImageChk = 0
    Global $hGui, $hBitmapG, $hGraphic, $hGraphicG, $num, $hWnd, $hDC
    Global $hBitmapG1, $hGraphic1, $hWnd1, $hDC1, $hGraphicG1, $tColorMatrix
    Global $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend, $m, $n
    Global $ColMatBut1, $ColMatBut2, $ColMatBut3, $ColMatBut4, $Combo1
    Global $ColMatForm, $comboData, $iX, $iY, $Add2MatrixStr
    Global $ContextMenu, $viewOrigImg, $viewMatrix, $Demos, $PreSetMat, $ChangeColMat, $MenuItemExit
    Global $separator1, $Cell[26], $init = 1
    Global $LastMatrix, $num
    Global $a,$b,$c  ; To use inside matrix in display. e.g. Assign( "a",0.9) = 1;  $a = 0.9
    Global $CA[17][26] = [[ "Identity Martix", 1, 0, 0, 0, 0, _
            0, 1, 0, 0, 0, _
            0, 0, 1, 0, 0, _
            0, 0, 0, 1, 0, _
            0, 0, 0, 0, 1], _
            [ "Gray Shade", 0.3, 0.3, 0.3, 0, 0, 0.59, 0.59, 0.59, 0, 0, _
            0.11, 0.11, 0.11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Pink Shade", 0.4, 0.3, 0.3, 0, 0, 0.7, 0.59, 0.59, 0, 0, _
            0.2, 0.11, 0.11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Yellow Shade", 0.4, 0.4, 0.3, 0, 0, 0.7, 0.7, 0.59, 0, 0, _
            0.2, 0.2, 0.11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Green Shade", 0.3, 0.4, 0.3, 0, 0, 0.59, 0.7, 0.59, 0, 0, _
            0.11, 0.2, 0.11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Blue Shade", 0.3, 0.3, 0.4, 0, 0, 0.59, 0.59, 0.7, 0, 0, _
            0.11, 0.11, 0.2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Gray Shade Alternate", 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, _
            0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0.2, 0.2, 0.2, 0, 1], _
            [ "Brighter", 1.5, 0, 0, 0, 0, 0, 1.5, 0, 0, 0, _
            0, 0, 1.5, 0, 0, 0, 0, 0, 1, 0, 0.05, 0.05, 0.05, 0, 1], _
            [ "Colour Boost", 1.4, 0, 0, 0, 0, 0, 1.4, 0, 0, 0, _
            0, 0, 1.4, 0, 0, 0, 0, 0, 1, 0, -0.2, -0.2, -0.2, 0, 1], _
            [ "Swap Color RGB2GBR", 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, _
            1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            ["Swap Color RGB2BRG", 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, _
            0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            ["Swap Color RGB2RBG", 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, _
            0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Swap Colors Transparent", 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, _
            1, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 1], _
            ["Trial insert in array", 0.7, 0, 0, 0, 0, 0, -0.9, 0, 0, 0, _
    0, 0, -0.9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "All White", 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, _
            1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 01, 1], _
            [ "All Black", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _
            0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], _
            [ "Test Martix", 0xff / 0xff + 0.11,                0,   0,  0, 0, _
                                              0, Assign( "a",0.9),   0,  0, 0, _
                                              0,             0, -$a/3,   0, 0, _
                                              0,                0,   0,  1, 0, _
                                              0,                0,   0,  0, 1 ]]
    
    ; In the ReadMat() Function, Execute(GUICtrlRead($Cell[$P])) is used to read Matrix data displayed.
    ; Test Matrix above works
    
    Local $iI, $iSize, $tBits, $tBMI, $hDC
    $LastMatrix = UBound($CA, 1) - 1
    $num = $LastMatrix
    
    ColorMatForm()
    
    _GDIPlus_Startup ()
    Local $ImageSrce, $Button1, $Button2, $Button3, $Button4, $Label1
    $ImageSrce = GUICreate("Source of Image", 204, 221, 351, 250, BitOR($WS_DLGFRAME, $WS_CLIPSIBLINGS))
    GUISetIcon("D:\002.ico")
    GUISetBkColor(0xFFFFE1)
    $Button1 = GUICtrlCreateButton("Screen Capture", 33, 37, 127, 25, 0)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetTip($Button1, "Capture Top Left quarter of desktop")
    $Button2 = GUICtrlCreateButton("Download Image", 34, 77, 127, 25, 0)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetTip($Button2, "If the 'autoit_builder_wall_800x600.jpg' file (122KB) is not in this script directory" & @CRLF & _
            "The file will auto-download from www.autoitscript.com, and be saved to this script directory. ")
    $Button3 = GUICtrlCreateButton("Open File ", 34, 117, 127, 25, 0)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetTip($Button3, "Opens Dialog for selection of an image.")
    $Button4 = GUICtrlCreateButton("Exit", 61, 157, 75, 25, 0)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0xFF0000)
    $Label1 = GUICtrlCreateLabel("Choose  Image  Source", 7, 4, 192, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState(@SW_SHOW)
    
    While 1
        Local $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $Button4
                Exit
            Case $Button1
                $hBitmap = _ScreenCapture_Capture ("", 0, 0, @DesktopWidth / 2.1, @DesktopHeight / 2.1, False)
                If Not @error Then ExitLoop
            Case $Button2
                If Not FileExists("autoit_builder_wall_800x600.jpg") Then
                    InetGet("http://www.autoitscript.com/autoit3/files/graphics/autoit_builder_wall_800x600.jpg",  _
                    @ScriptDir & "\autoit_builder_wall_800x600.jpg", 1, 0)
                    ;While @InetGetActive
                    ;  TrayTip("Downloading", "Bytes = " & @InetGetBytesRead, 10, 16)
                    ;  Sleep(250)
                    ;Wend
                EndIf
                Local $hImg = _GDIPlus_ImageLoadFromFile (@ScriptDir & "\autoit_builder_wall_800x600.jpg")
                If $hImg = 0 Then SetError(1, 0, 0)
                $hBitmap = _GDIPlus_ImageCreateGDICompatibleHBITMAP($hImg)
                _GDIPlus_ImageDispose ($hImg)
                If Not @error Then ExitLoop
              
            Case $Button3
                Local $Path = FileOpenDialog("Choose Image File", @ScriptDir & "", _
                                    "Images (*.gif;*.png;*.jpg;*.bmp)| All (*.*)")
                If $Path <> "" Then
                    Local $hImg = _GDIPlus_ImageLoadFromFile ($Path)
                    If $hImg = 0 Then SetError(1, 0, 0)
                    Local $hBitmap = _GDIPlus_ImageCreateGDICompatibleHBITMAP($hImg)
                    _GDIPlus_ImageDispose ($hImg)
                    If Not @error Then ExitLoop
                EndIf
        EndSwitch
    WEnd
    GUIDelete($ImageSrce)
    
    Opt("GUIOnEventMode", 1)
    
    ShowaColMatFrm()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
    $iX = _GDIPlus_ImageGetWidth ($hImage)
    $iY = _GDIPlus_ImageGetHeight ($hImage)
    
    _WinAPI_DeleteObject ($hBitmap)
    $hGui = GUICreate("GDI+", $iX, $iY, 10, 10, $WS_POPUP, $WS_EX_LAYERED) ;BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUIRegisterMsg($WM_LBUTTONDOWN, "_WinMove") ; Drag Window 2 of 3 addin
    GUISetState(@SW_HIDE, $hGui) ;@SW_SHOW
    
    $hWnd = _WinAPI_GetDC ($hGui)
    $hDC = _WinAPI_CreateCompatibleDC ($hWnd)
    $hBitmapG = _WinAPI_CreateCompatibleBitmap ($hWnd, $iX, $iY) ; $iWidth, $iHeight)
    _WinAPI_SelectObject ($hDC, $hBitmapG)
    $hGraphicG = _GDIPlus_GraphicsCreateFromHDC ($hDC)
    _GDIPlus_GraphicsDrawImage ($hGraphicG, $hImage, 0, 0)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iX)  ;$iWidth )
    DllStructSetData($tSize, "Y", $iY)  ;$iHeight)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow ($hGui, $hWnd, 0, $pSize, $hDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    
    $hGui1 = GUICreate("GDI1", $iX, $iY, $iX, 20, $WS_POPUP, $WS_EX_LAYERED) ; BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
    $ContextMenu = GUICtrlCreateContextMenu()
    $viewOrigImg = GUICtrlCreateMenuItem("Show Original Image", $ContextMenu)
    GUICtrlSetOnEvent($viewOrigImg, "ShowaOrig")
    GUICtrlSetState($viewOrigImg, $GUI_UNCHECKED)
    $viewMatrix = GUICtrlCreateMenuItem("Show Matrix", $ContextMenu)
    GUICtrlSetOnEvent($viewMatrix, "ShowaColMatFrm")
    GUICtrlSetState($viewMatrix, $GUI_CHECKED)
    $Demos = GUICtrlCreateMenu("Demos", $ContextMenu)
    $PreSetMat = GUICtrlCreateMenuItem("Preset Matrices - Press Crtl key to scroll thru array of matrices.", $Demos)
    GUICtrlSetOnEvent($PreSetMat, "ScrollMatArray")
    $ChangeColMat = GUICtrlCreateMenuItem("Auto Change Colors (Press Shift once) @ Esc once to stop", $Demos)
    GUICtrlSetOnEvent($ChangeColMat, "AutoColChange")
    $separator1 = GUICtrlCreateMenuItem("", $ContextMenu) ; create a separator line
    $MenuItemExit = GUICtrlCreateMenuItem("Exit  (Esc)", $ContextMenu)
    GUICtrlSetOnEvent($MenuItemExit, "Quit")
    
    GUISetState()
    
    $hWnd1 = _WinAPI_GetDC ($hGui1)
    $hDC1 = _WinAPI_CreateCompatibleDC ($hWnd1)
    
    $hImage1 = $hImage
    While 1
        If _IsPressed("11") Or $init = 1 Then   ;Ctrl key and initial run
            ScrollMatArray()
    
        EndIf
        If _IsPressed("A1") Or _IsPressed("A0") Then ; Right Shift and Left Shift keys
            AutoColChange()
    
        EndIf
    
        $init = 0
        Sleep(10)
    WEnd
    DllClose($dll)
    
    _GDIPlus_GraphicsDispose ($hGraphicG)
    _WinAPI_ReleaseDC ($hGui, $hWnd)
    _WinAPI_DeleteObject ($hBitmap)
    _WinAPI_DeleteDC ($hDC)
    _GDIPlus_ImageDispose ($hImage)
    _WinAPI_ReleaseDC ($hGui1, $hWnd1)
    _WinAPI_DeleteDC ($hDC1)
    _GDIPlus_ImageDispose ($hImage1)
    _GDIPlus_Shutdown ()
    
    
    ;  Displays image with the applied matrix
    Func ImageMatrix()
        Local $pSize1, $tSize1, $pSource1, $tSource1, $pBlend1, $tBlend1, $tColorMatrix
        Local $x, $hImgAttrib, $iW = _GDIPlus_ImageGetWidth ($hImage1), _
                $iH = _GDIPlus_ImageGetHeight ($hImage1), $hGraphics, $hBitmap
      
        $hBitmapG1 = _WinAPI_CreateCompatibleBitmap ($hWnd1, $iX, $iY) ; $iWidth, $iHeight)
        _WinAPI_SelectObject ($hDC1, $hBitmapG1)
        $hGraphicG1 = _GDIPlus_GraphicsCreateFromHDC ($hDC1)
        $tColorMatrix = DllStructCreate("float[5];float[5];float[5];float[5];float[5]")
        ;; Loads current Matrix int matrix display Gui
        LoadMat2Display($num)
        ;;Color adjustment  values:
        $x = DllStructSetData($tColorMatrix, 1, $CA[$num][1], 1) * DllStructSetData($tColorMatrix, 1, $CA[$num][2], 2) * _
        DllStructSetData($tColorMatrix, 1, $CA[$num][3], 3) * DllStructSetData($tColorMatrix, 2, $CA[$num][6], 1) * _
        DllStructSetData($tColorMatrix, 2, $CA[$num][7], 2) * DllStructSetData($tColorMatrix, 2, $CA[$num][8], 3) * _
        DllStructSetData($tColorMatrix, 3, $CA[$num][11], 1) * DllStructSetData($tColorMatrix, 3, $CA[$num][12], 2) * _
        DllStructSetData($tColorMatrix, 3, $CA[$num][13], 3) * DllStructSetData($tColorMatrix, 4, $CA[$num][19], 4) * _
        DllStructSetData($tColorMatrix, 5, $CA[$num][21], 1) * DllStructSetData($tColorMatrix, 5, $CA[$num][22], 2) * _
        DllStructSetData($tColorMatrix, 5, $CA[$num][23], 3) * _
        DllStructSetData($tColorMatrix, 5, $CA[$num][24], 4) * DllStructSetData($tColorMatrix, 5, $CA[$num][25], 5)
        ;;create an image attributes object and update its color matrix
        $hImgAttrib = _GDIPlus_ImageAttributesCreate()
        _GDIPlus_ImageAttributesSetColorMatrix($hImgAttrib, 1, DllStructGetPtr($tColorMatrix))
      
        ;;draw original into copy with attributes
        _GDIPlus_GraphicsDrawImageRectRectEx($hGraphicG1, $hImage1, 0, 0, $iW, $iH, 0, 0, $iW, $iH, 2, $hImgAttrib)
      
        $tSize1 = DllStructCreate($tagSIZE)
        $pSize1 = DllStructGetPtr($tSize1)
        DllStructSetData($tSize1, "X", $iX)  ;$iWidth )
        DllStructSetData($tSize1, "Y", $iY)  ;$iHeight)
        $tSource1 = DllStructCreate($tagPOINT)
        $pSource1 = DllStructGetPtr($tSource1)
        $tBlend1 = DllStructCreate($tagBLENDFUNCTION)
        $pBlend1 = DllStructGetPtr($tBlend1)
        DllStructSetData($tBlend1, "Alpha", $iOpacity)
        DllStructSetData($tBlend1, "Format", 1)
        _WinAPI_UpdateLayeredWindow ($hGui1, $hWnd1, 0, $pSize1, $hDC1, $pSource1, 0, $pBlend1, $ULW_ALPHA)
      
        ;;clean up
        _GDIPlus_GraphicsDispose ($hGraphics)
        _GDIPlus_GraphicsDispose ($hGraphicG1)
        _GDIPlus_ImageAttributesDispose($hImgAttrib)
        _WinAPI_DeleteObject ($hBitmap)
        _WinAPI_DeleteObject ($hBitmapG1)
        Return 1
    EndFunc   ;==>ImageMatrix
    
    Func _GDIPlus_ImageAttributesSetColorMatrix($hImgAttrib, $iColorAdjustType, _
            $pColorMatrix = 0, $pGreyMatrix = 0, $iColorMatrixFlags = 0)
        Local $fEnable = 1, $aResult = DllCall($ghGDIPDll, "int", _
                "GdipSetImageAttributesColorMatrix", "ptr", $hImgAttrib, "int", $iColorAdjustType, _
                "int", $fEnable, "ptr", $pColorMatrix, "ptr", $pGreyMatrix, "int", $iColorMatrixFlags)
        Return SetError($aResult[0], 0, $aResult[0] = 0)
    EndFunc   ;==>_GDIPlus_ImageAttributesSetColorMatrix
    
    ;;Creates ImageAttributes object
    Func _GDIPlus_ImageAttributesCreate()
        Local $aResult = DllCall($ghGDIPDll, "int", _
                "GdipCreateImageAttributes", "ptr*", 0)
        Return SetError($aResult[0], 0, $aResult[1])
    EndFunc   ;==>_GDIPlus_ImageAttributesCreate
    
    ;;Deletes ImageAttributes object
    Func _GDIPlus_ImageAttributesDispose($hImgAttrib)
        Local $aResult = DllCall($ghGDIPDll, "int", _
                "GdipDisposeImageAttributes", "ptr", $hImgAttrib)
        Return SetError($aResult[0], 0, $aResult[0] = 0)
    EndFunc   ;==>_GDIPlus_ImageAttributesDispose
    
    ; _GDIPlus_GraphicsDrawImageRectRectEx()
    ; Same as _GDIPlus_GraphicsDrawImageRectRect(),
    ; but adds 1 optional parameter - $hImgAttrib (handle to ImageAttributes object)
    Func _GDIPlus_GraphicsDrawImageRectRectEx($hGraphics, $hImage, $iSrcX, $iSrcY, $iSrcWidth, _
            $iSrcHeight, $iDstX, $iDstY, $iDstWidth, $iDstHeight, $iUnit = 2, $hImgAttrib = 0)
        Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawImageRectRectI", "hwnd", _
                $hGraphics, "hwnd", $hImage, "int", $iDstX, "int", _
                $iDstY, "int", $iDstWidth, "int", $iDstHeight, "int", $iSrcX, "int", $iSrcY, "int", _
                $iSrcWidth, "int", $iSrcHeight, "int", $iUnit, "ptr", $hImgAttrib, "int", 0, "int", 0)
        Return SetError($aResult[0], 0, $aResult[0] = 0)
    EndFunc   ;==>_GDIPlus_GraphicsDrawImageRectRectEx
    
    ; Demo - Scroll thru Matrix Array
    Func ScrollMatArray()
        $init = 0
        $num = Mod($num + 1, $LastMatrix + 1)
        ;$num = 13
        GUICtrlSetData($Combo1, $CA[$num][0])
        ImageMatrix()
        Return 1
    EndFunc   ;==>ScrollMatArray
    
    ; Demo - Auto Colour Change
    Func AutoColChange()
        If $init = 2 Then
            $init = 0
        Else
            $init = 2
            $num = 0
            LoadMat2Display($num)
            $num = $LastMatrix  
            GUICtrlSetData($Combo1, $CA[$num][0])   
        EndIf
        While $init = 2
            If _IsPressed("11") Or _IsPressed("1B") Then ExitLoop ;CTRL key and Escape key
            $m = Mod($m + 1, 20)
            $n = Mod($n + 1, 24)
            $CA[$LastMatrix][1] = -($m - 8) / 10
            $CA[$LastMatrix][7] = ($m - 10) / 10
            $CA[$LastMatrix][13] = -($n - 12) / 10
            ImageMatrix()
            Sleep(1000)
        WEnd
        $init = 0
        Sleep(800)
        Return 1
    EndFunc   ;==>AutoColChange
    
    ; Toggles show/hide original image
    Func ShowaOrig()
        If $OrigImageChk = 1 Then   
            GUICtrlSetState($viewOrigImg, $GUI_UNCHECKED)
            GUISetState(@SW_HIDE, $hGui)
            $OrigImageChk = 0
        Else
            GUICtrlSetState($viewOrigImg, $GUI_CHECKED)
            GUISetState(@SW_SHOW, $hGui)
            $OrigImageChk = 1
        EndIf
      
        Return 1
    EndFunc   ;==>ShowaOrig
    
    ; Toggles show/hide matrix Gui
    Func ShowaColMatFrm()
        If $MatMenuChk = 1 Then
            GUICtrlSetState($viewMatrix, $GUI_UNCHECKED)
            GUISetState(@SW_HIDE, $ColMatForm)
            $MatMenuChk = 0
        Else
            GUICtrlSetState($viewMatrix, $GUI_CHECKED)
            GUISetState(@SW_SHOW, $ColMatForm)
            $MatMenuChk = 1
        EndIf
        ;
        ;MsgBox(0,"",GUICtrlRead($viewMatrix))
        Return 1
    EndFunc   ;==>ShowaColMatFrm
    
    ;When selection in combo, load corresponding matrix
    Func ComboLoadMatDat()
        Local $dat, $f
        $dat = GUICtrlRead($Combo1)
        For $f = 0 To $LastMatrix
            If $CA[$f][0] = $dat Then $num = $f
        Next
        ;ReadMat($num)
        ;GUICtrlSetData($Combo1, $CA[$num][0])
        ImageMatrix()
        Return 1
    EndFunc   ;==>ComboLoadMatDat
    
    ; Loads current Matrix int matrix display Gui
    Func LoadMat2Display($number = $LastMatrix)
        If $MatMenuChk = 1 Then
            For $P = 1 To 25
                GUICtrlSetData($Cell[$P], $CA[$number][$P])
            Next
        EndIf
        Return 1
    EndFunc   ;==>LoadMat2Display
    
    ;When Apply Matrix is pressed, Stores Matrix's element values to last matrix in array
    Func ApplyColMat()
        $num = $LastMatrix
        ReadMat($num)
        GUICtrlSetData($Combo1, $CA[$num][0])
        ImageMatrix()
        Return 1
    EndFunc   ;==>ApplyColMat
    
    ; Reads Matrix in Gui and enters into last matrix in array of matrices
    Func ReadMat($number = $LastMatrix)
        For $P = 1 To 25
            $CA[$number][$P] = Execute(GUICtrlRead($Cell[$P]))
        Next
        Return 1
    EndFunc   ;==>ReadMat
    
    ; To save matrix data - writes to console. Formatted to copy into $CA matrix array at top of script.
    Func WriteConsole()
        $Add2MatrixStr &= "[" & '"' & "Change to your label" & '"' & ", "
        For $x = 1 To 10
            $Add2MatrixStr &= $CA[$LastMatrix][$x] & ", "
        Next
        $Add2MatrixStr &= "_" & @CRLF
        For $x = 11 To 25
            $Add2MatrixStr &= $CA[$LastMatrix][$x] & ", "
        Next
        $Add2MatrixStr = StringTrimRight($Add2MatrixStr, 2)
        $Add2MatrixStr &= "], _" & @CRLF & @CRLF
        ConsoleWrite($Add2MatrixStr)
        ConsoleWrite("Copy above matrix. Insert between existing matrices in declaration of Global $CA[14][26]" & @CRLF & _
                " in script. Also, increase number of matrices in array. " & @CRLF & _
                "eg. if $CA[14][26] increase to $CA[15][26] Then re-run script. " & @CRLF)
    EndFunc   ;==>WriteConsole
          
    ;Saves generated image to disk
    Func SaveImage()
        Local $ext, $sCLSID
        Local $Path = FileSaveDialog("Save Current Image", @ScriptDir, "Images (*.gif;*.png;*.jpg;*.bmp)| All (*.*)", 16)
        If $Path <> "" Then
            $ext = StringUpper(StringRight($Path, 3))
            If $ext = "GIF"  Or $ext = "PNG"  Or $ext = "JPG"  Or $ext = "BMP"  Then
                $sCLSID = _GDIPlus_EncodersGetCLSID ($ext)
                ;$SaveFlag = 1
                ApplyColMat()
                Local $tColorMatrix, $x, $hImgAttrib, $iW = _GDIPlus_ImageGetWidth ($hImage1)
                Local $iH = _GDIPlus_ImageGetHeight ($hImage1), $hGraphics
                Local $hGraphics2, $hBitmap
                ;;create color matrix data
                $tColorMatrix = DllStructCreate("float[5];float[5];float[5];float[5];float[5]")
                LoadMat2Display($num)
                $x = DllStructSetData($tColorMatrix, 1, $CA[$num][1], 1) * DllStructSetData($tColorMatrix, 1, $CA[$num][2], 2) * _
                DllStructSetData($tColorMatrix, 1, $CA[$num][3], 3) * DllStructSetData($tColorMatrix, 2, $CA[$num][6], 1) * _
                DllStructSetData($tColorMatrix, 2, $CA[$num][7], 2) * DllStructSetData($tColorMatrix, 2, $CA[$num][8], 3) * _
                DllStructSetData($tColorMatrix, 3, $CA[$num][11], 1) * DllStructSetData($tColorMatrix, 3, $CA[$num][12], 2) * _
                DllStructSetData($tColorMatrix, 3, $CA[$num][13], 3) * DllStructSetData($tColorMatrix, 4, $CA[$num][19], 4) * _
                DllStructSetData($tColorMatrix, 5, $CA[$num][21], 1) * DllStructSetData($tColorMatrix, 5, $CA[$num][22], 2) * _
                DllStructSetData($tColorMatrix, 5, $CA[$num][23], 3) * _
                DllStructSetData($tColorMatrix, 5, $CA[$num][24], 4) * DllStructSetData($tColorMatrix, 5, $CA[$num][25], 5)
                ;;create an image attributes object and update its color matrix
                $hImgAttrib = _GDIPlus_ImageAttributesCreate()
                _GDIPlus_ImageAttributesSetColorMatrix($hImgAttrib, 1, DllStructGetPtr($tColorMatrix))
                ;;copy image
                $hGraphics = _GDIPlus_ImageGetGraphicsContext ($hImage1)
                $hBitmap = _GDIPlus_BitmapCreateFromGraphics ($iW, $iH, $hGraphics)
                $hGraphics2 = _GDIPlus_ImageGetGraphicsContext ($hBitmap)
                ;;draw original into copy with attributes
                _GDIPlus_GraphicsDrawImageRectRectEx($hGraphics2, $hImage1, 0, 0, $iW, $iH, 0, 0, $iW, $iH, 2, $hImgAttrib)
                ;;clean up
                _GDIPlus_GraphicsDispose ($hGraphics)
                _GDIPlus_GraphicsDispose ($hGraphics2)
                _GDIPlus_ImageAttributesDispose($hImgAttrib)
                ; Save image
                _GDIPlus_ImageSaveToFileEx ($hBitmap, $Path, $sCLSID)
              
                _GDIPlus_GraphicsDispose ($hGraphics)
                _GDIPlus_GraphicsDispose ($hGraphics2)
                _GDIPlus_ImageAttributesDispose($hImgAttrib)
                _GDIPlus_ImageDispose ($hBitmap)
            EndIf
        EndIf
        Return 1
    EndFunc   ;==>SaveImage
    
    ; If in Auto-generate demo Esc exits that loop. Otherwise, exits script.
    Func Quit()
        Local $e
        If $init = 2 Then  ; For AutoColChange() while loop
            $init = 0
        Else
            $e = MsgBox(1, "Exit", "Press OK to Exit")
            If $e = 1 Then Exit
        EndIf
        Return 1
    EndFunc   ;==>Quit
    
    ; The Gui contains matrix data display, buttons and combobox of pre-defined matrices from array.
    Func ColorMatForm()
        Local $Group1, $Group2, $Group3, $Group4, $Group5, $Group6, $Group7, $Label1, $Label2
        $ColMatForm = GUICreate("Form1", 775, 243, 290, @DesktopHeight * 0.7, BitOR($WS_POPUP, $WS_BORDER))
        $Group1 = GUICtrlCreateGroup("Color Matrix 5x5", 6, 4, 760, 197)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        $Group2 = GUICtrlCreateGroup(" Red ", 148, 19, 137, 101)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        GUICtrlSetColor(-1, 0xFF0000)
        $Cell[1] = GUICtrlCreateInput("0xff / 0xff + 0.11", 154, 36, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[2] = GUICtrlCreateInput("0", 293, 36, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[3] = GUICtrlCreateInput("0", 430, 36, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Group3 = GUICtrlCreateGroup("Green", 288, 19, 137, 101)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        GUICtrlSetColor(-1, 0x00A000)
        $Cell[4] = GUICtrlCreateInput("0", 564, 36, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[5] = GUICtrlCreateInput("0", 692, 36, 49, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[6] = GUICtrlCreateInput("0", 154, 64, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Group4 = GUICtrlCreateGroup(" Blue ", 425, 19, 133, 101)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        GUICtrlSetColor(-1, 0x0000FF)
        $Cell[7] = GUICtrlCreateInput("1", 293, 64, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[8] = GUICtrlCreateInput("0", 430, 64, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[9] = GUICtrlCreateInput("0", 564, 64, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Group5 = GUICtrlCreateGroup(" Unused ", 558, 19, 191, 101)
        $Cell[10] = GUICtrlCreateInput("0", 692, 64, 49, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[11] = GUICtrlCreateInput("0", 154, 92, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[12] = GUICtrlCreateInput("0", 293, 92, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[13] = GUICtrlCreateInput("1", 430, 93, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[14] = GUICtrlCreateInput("0", 564, 93, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[15] = GUICtrlCreateInput("0", 693, 93, 49, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Group6 = GUICtrlCreateGroup("", 148, 114, 601, 39)
        $Cell[16] = GUICtrlCreateInput("0", 154, 124, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[17] = GUICtrlCreateInput("0", 293, 124, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[18] = GUICtrlCreateInput("0", 430, 124, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        $Cell[19] = GUICtrlCreateInput("1", 564, 124, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[20] = GUICtrlCreateInput("0", 692, 124, 49, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Group7 = GUICtrlCreateGroup("", 148, 146, 601, 39)
        $Cell[21] = GUICtrlCreateInput("0", 154, 156, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[22] = GUICtrlCreateInput("0", 293, 156, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[23] = GUICtrlCreateInput("0", 430, 156, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[24] = GUICtrlCreateInput("0", 564, 156, 125, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        $Cell[25] = GUICtrlCreateInput("1", 692, 156, 49, 24, BitOR($ES_RIGHT, $ES_AUTOHSCROLL))
        GUICtrlSetBkColor(-1, 0xD4D0C8)
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $Label1 = GUICtrlCreateLabel("Alpha Channel", 44, 128, 106, 20)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        $Label2 = GUICtrlCreateLabel("RGBA Additive Row", 8, 158, 142, 21)
        GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
        For $f = 0 To $LastMatrix
            $comboData &= $CA[$f][0] & "|"
        Next
        $Combo1 = GUICtrlCreateCombo("", 10, 28, 133, 25)
        GUICtrlSetData($Combo1, StringTrimRight($comboData, 1))
        GUICtrlSetOnEvent($Combo1, "ComboLoadMatDat")
        GUICtrlCreateGroup("", -99, -99, 1, 1)
        $ColMatBut1 = GUICtrlCreateButton("Save Current Image", 4, 206, 120, 30, $BS_FLAT)
        GUICtrlSetBkColor(-1, 0x00FFFF)
        GUICtrlSetOnEvent($ColMatBut1, "SaveImage")
        $ColMatBut2 = GUICtrlCreateButton("Write Matrix to Console", 132, 207, 118, 30, $BS_FLAT)
        GUICtrlSetBkColor(-1, 0xFFFF00)
        GUICtrlSetOnEvent($ColMatBut2, "WriteConsole")
        $ColMatBut3 = GUICtrlCreateButton("Apply Matrix ", 260, 207, 125, 30, $BS_FLAT)
        GUICtrlSetBkColor(-1, 0x00FF00)
        GUICtrlSetOnEvent($ColMatBut3, "ApplyColMat")
        $ColMatBut4 = GUICtrlCreateButton("Hide Matrix Display", 393, 206, 100, 30, $BS_FLAT)
        GUICtrlSetBkColor(-1, 0xFF00FF)
        GUICtrlSetOnEvent($ColMatBut4, "ShowaColMatFrm")
        Return 1
    EndFunc   ;==>ColorMatForm
    
    ; Description:: Converts a GDIPlus-Image to GDI-combatible HBITMAP
    ; Parameter(s): $hImg -> GDIplus Image object
    ; Requirement(s):  GDIPlus.au3
    ; Return Value(s): HBITMAP, compatible with ClipBoard
    ; Author(s):       Prog@ndy
    Func _GDIPlus_ImageCreateGDICompatibleHBITMAP($hImg)
        Local $hBitmap2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap ($hImg)
        Local $hBitmap = _WinAPI_CopyImage($hBitmap2, 0, 0, 0, $LR_COPYDELETEORG + $LR_COPYRETURNORG)
        _WinAPI_DeleteObject ($hBitmap2)
        Return $hBitmap
    EndFunc   ;==>_GDIPlus_ImageCreateGDICompatibleHBITMAP
    
    ; Description:: Copies an image, also makes GDIPlus-HBITMAP to GDI32-BITMAP
    ; Parameter(s): $hImg -> HBITMAP Object, GDI or GDIPlus
    ; Requirement(s):  WinAPI.au3
    ; Return Value(s): Succes: Handle to new Bitmap, Error: 0
    ; Author(s):       Prog@ndy
    Func _WinAPI_CopyImage($hImg, $uType = 0, $x = 0, $y = 0, $flags = 0)
        Local $aResult
        $aResult = DllCall("User32.dll", "hwnd", "CopyImage", "hwnd", $hImg, "UINT", $uType, "int", $x, "int", $y, "UINT", $flags)
        ;_WinAPI_Check ("_WinAPI_CopyImage", ($aResult[0] = 0), 0, True)
        Return $aResult[0]
    EndFunc   ;==>_WinAPI_CopyImage
    
    ; Drag Window 3 of 3 addin
    Func _WinMove($hWnd, $Command, $wParam, $lParam)
        If BitAND(WinGetState($hWnd), 32) Then Return $GUI_RUNDEFMSG
        ;DllCall("user32.dll", "long", "SendMessage", "hwnd", $HWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
        DllCall("user32.dll", "int", "SendMessage", "hWnd", $hWnd, "int", $WM_NCLBUTTONDOWN, "int", $HTCAPTION, "int", 0)
        Return 1
    EndFunc   ;==>_WinMove

To learn more about a Colour Matrix, here are some reference sites.

http://www.codeproject.com/KB/GDI-plus/colormatrix.aspx

http://boredzo.org/blog/archives/category/...hics/core-image

http://www.reflectiveimages.com/digitalvelvia.htm

http://www.imagemagick.org/Usage/color/

http://blog.zacharcher.com/2007/10/

Edit: Added Picture Effects to thread title.

Edited by Malkey

Share this post


Link to post
Share on other sites
XxXFaNtA

Great! Have been trying to do that in GDI+ aswell but couldn't really manage it!

Great alternative to prospeeds function :)

Share this post


Link to post
Share on other sites
ludocus

Wow... Impressive, Cool and sweet!

Share this post


Link to post
Share on other sites
ludocus

I would change the title to: 'Picture effects' if I were you :)

Share this post


Link to post
Share on other sites
XxXFaNtA

I wouldn't.

The Title states out what this does..."Picture Effects" would be maybe interesting for noobs to play around, but wouldn't actually tell people what it's used for!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.