Jump to content
Sign in to follow this  
UEZ

GDI+ Show Histogram v0.98 beta build 2015-07-13

Recommended Posts

Here a little tool to display the histogram of an image (inspired by this thread):

)

post-29844-0-08200900-1359724336_thumb.p

;#AutoIt3Wrapper_Icon=Histogram1.ico
#AutoIt3Wrapper_Compile_Both=y
;#AutoIt3Wrapper_Res_Field=CompanyName|UEZ Software Development
;#AutoIt3Wrapper_Res_Field=ProductName|GDI+ Show Histogram
;#AutoIt3Wrapper_Res_Field=ProductVersion|%AutoItVer%
#AutoIt3Wrapper_Res_Fileversion=0.9.8.0
;#AutoIt3Wrapper_Res_Field=Build|2015-07-10
#AutoIt3Wrapper_Res_LegalCopyright=UEZ Software Development
#AutoIt3Wrapper_Res_Language=1033
;#AutoIt3Wrapper_Res_Field=URL|http://www.autoitscript.com/forum/index.php?showtopic=147777
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/so /pe /rm
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3"
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_UPX_Parameters=--best --lzma
#AutoIt3Wrapper_Run_After=upx.exe --best --lzma "GDI+ Show Histogram_x64.exe"
#AutoIt3Wrapper_UseX64=n

#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>

Opt("MustDeclareVars", 1)
Opt("MouseCoordMode", 2)

_GDIPlus_Startup()
If @error Then Exit MsgBox(0x40010, "Error", "GDI+ Show Histogram can run on operating systems Vista or newer only!")

Global $ghGDIPDll = $__g_hGDIPDll, $aRes
Global Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")
Global Const $aFullScreen = WinGetPos($hFullScreen)

Global Enum $HistogramFormatARGB, $HistogramFormatPARGB, $HistogramFormatRGB, $HistogramFormatGray, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534129(v=vs.85).aspx
        $HistogramFormatB, $HistogramFormatG, $HistogramFormatR, $HistogramFormatA

Global $tStructChannel0 = DllStructCreate("uint channel0[256]")
Global $pStructChannel0 = DllStructGetPtr($tStructChannel0)
Global $tStructChannel1 = DllStructCreate("uint channel1[256]")
Global $pStructChannel1 = DllStructGetPtr($tStructChannel1)
Global $tStructChannel2 = DllStructCreate("uint channel2[256]")
Global $pStructChannel2 = DllStructGetPtr($tStructChannel2)
Global $tStructChannel3 = DllStructCreate("uint channel3[256]")
Global $pStructChannel3 = DllStructGetPtr($tStructChannel3)

Global $s, $sFile, $hImage, $bImgLoaded = False, $aLuminosity[257], $aCRGB[257]
Global Const $STM_SETIMAGE = 0x0172, $iLineJoinBevel = 1, $frY = 0.299, $fgY = 0.587, $fbY = 0.114

Global Const $hGUI = GUICreate("GDI+ Show Histogram v0.98 beta by UEZ build 2015-07-13", 468, 310, -1, -1, Default, Default)
GUISetBkColor(0xFFFFFF, $hGUI)
Global Const $sLabel_Titel_Txt = "GDI+ Show Histogram"
Global Const $iPosX_Label = 20, $iPosY_Label = 12
Global Const $iLabel_Titel_Shadow = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label, $iPosY_Label, 429, 57)
GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4)
GUICtrlSetColor(-1, 0xC0C0D8)
Global Const $iLabel_Titel = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label - 4, $iPosY_Label - 4, 429, 57)
GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4)
GUICtrlSetColor(-1, 0x0000C0)
GUICtrlSetBkColor(-1, -2)
Global Const $iPic_Histogram = GUICtrlCreatePic("", 20, 90, 255, 127, -1, $WS_EX_STATICEDGE)
GUICtrlSetCursor(-1, 14)
Global Const $iPic_ColorGradient = GUICtrlCreatePic("", 20, 220, 255, 24, -1, $WS_EX_STATICEDGE)

Global Const $iGroup = GUICtrlCreateGroup("Channel", 290, 84, 160, 164)
Global Const $iRadio_L = GUICtrlCreateRadio("Luminosit&y (gray)", 300, 100, 110, 20)
GUICtrlSetTip(-1, $frY & "*R,  " & $fgY & "*G, " & $fbY & "*B")
GUICtrlSetState($iRadio_L, $GUI_CHECKED)
Global Const $iRadio_C = GUICtrlCreateRadio("&cRGB", 300, 130, 60, 20)
GUICtrlSetTip(-1, "Combined average of RGB values")
Global Const $iRadio_R = GUICtrlCreateRadio("&Red", 300, 160, 60, 20)
Global Const $iRadio_G = GUICtrlCreateRadio("&Green", 300, 190, 60, 20)
Global Const $iRadio_B = GUICtrlCreateRadio("&Blue", 300, 220, 60, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global Const $iButton_Save = GUICtrlCreateButton("&Save", 209, 265, 70, 30)
GUICtrlSetTip(-1, "Click button to save all histogram images")
GUICtrlSetState(-1, $GUI_DISABLE)
Global Const $iButton_Load = GUICtrlCreateButton("&Load", 290, 265, 70, 30)
GUICtrlSetTip(-1, "Click button to load an image")
Global Const $iButton_Exit = GUICtrlCreateButton("E&xit", 390, 265, 60, 30)

Global $sLabelCredit_Txt = "coded by UEZ'13"
Global $aLabelCredit_Pos[StringLen($sLabelCredit_Txt)][4], $u, $iFS = 6.5, $iY = 280
For $u = 0 To UBound($aLabelCredit_Pos) - 1
    $aLabelCredit_Pos[$u][0] = StringMid($sLabelCredit_Txt, $u + 1, 1)
    $aLabelCredit_Pos[$u][1] = 20 + $u * ($iFS - 0.25)
    $aLabelCredit_Pos[$u][2] = $iY
    $aLabelCredit_Pos[$u][3] = GUICtrlCreateLabel($aLabelCredit_Pos[$u][0], $aLabelCredit_Pos[$u][1], $aLabelCredit_Pos[$u][2], $iFS, $iFS * 1.8)
    GUICtrlSetFont(-1, $iFS, 400, 0, "Comic Sans MS", 2)
    GUICtrlSetColor(-1, 0x006000)
Next
Global $aLabelCredit_AnimPos[300]
For $u = 0 To UBound($aLabelCredit_AnimPos) - 1
    $aLabelCredit_AnimPos[$u] = $iY
Next
Global Const $fLimes = 2.2, $fStep = 0.1
Global $iPT = 0, $z = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2)
For $u = 0 To $fLimes Step $fStep
    $aLabelCredit_AnimPos[$z] = $iY + Sin($iPT * 4) * 10
    $z += 1
    $iPT += 0.075
Next

Global $ihGui_PreviewSize = 256, $iBGColor = 0xF0F0F0
Global $hGui_Preview = GUICreate("", $ihGui_PreviewSize, $ihGui_PreviewSize + 58, -1, -1, $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST, $hGUI)
Global $iPic_Preview = GUICtrlCreatePic("", 0, 0, $ihGui_PreviewSize, $ihGui_PreviewSize)
Global $idLabel_Info = GUICtrlCreateLabel("", 0, $ihGui_PreviewSize, $ihGui_PreviewSize * 2, 58)
GUICtrlSetFont(-1, 8.5, 400, 0, "Arial", 5)
GUICtrlSetColor(-1, $iBGColor)
GUICtrlSetBkColor(-1, 0x333333)

Global Const $hTexture_Checkerboard = _GDIPlus_CreateCheckerboardTexture(8, 0xFFFBFBFB, 0xFFFFFFFF)

Global $hHBmp_L = _GDIPlus_CreateColorGradient("L", 256, 24)
Global $hHBmp_C = _GDIPlus_CreateColorGradient("C", 256, 24)
Global $hHBmp_R = _GDIPlus_CreateColorGradient("R", 256, 24)
Global $hHBmp_G = _GDIPlus_CreateColorGradient("G", 256, 24)
Global $hHBmp_B = _GDIPlus_CreateColorGradient("B", 256, 24)
Global Const $hHBmp_HL = _GDIPlus_BitmapCreateFromScan0(256, 127)
Global Const $hCtxt_HL = _GDIPlus_ImageGetGraphicsContext($hHBmp_HL)
Global Const $hHBmp_HC = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HC = _GDIPlus_ImageGetGraphicsContext($hHBmp_HC)
Global Const $hHBmp_HR = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HR = _GDIPlus_ImageGetGraphicsContext($hHBmp_HR)
Global Const $hHBmp_HG = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HG = _GDIPlus_ImageGetGraphicsContext($hHBmp_HG)
Global Const $hHBmp_HB = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HB = _GDIPlus_ImageGetGraphicsContext($hHBmp_HB)
_GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF)

_hBmpToPicControl($iPic_ColorGradient, $hHBmp_L)

Global $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL)
_hBmpToPicControl($iPic_Histogram, $hB_H, 1)

GUISetState(@SW_HIDE, $hGui_Preview)
GUISetState(@SW_SHOW, $hGUI)
ControlFocus($hGUI, "", $iButton_Load)

Global $hPen_H = _GDIPlus_PenCreate()

$s = "L"
Global $iDummyL = GUICtrlCreateDummy(), $iDummyC = GUICtrlCreateDummy(), $iDummyR = GUICtrlCreateDummy(), $iDummyG = GUICtrlCreateDummy(), $iDummyB = GUICtrlCreateDummy()
Global $iHistogramFormat, $hHBmp_Preview, $aPosCtrl, $aPosWin, $aMouseInfo, $aPos_hWnd, $imp, $iVal, $iMpos_oldx, $iMpos_oldy, $sType, $iPaletteType, $iPixelFormat
Global $fAverage_L, $fAverage_cRGB, $iAverage_R, $iAverage_B, $iAverage_G, $o = 0
Global  $bShow = False, $bHide = False, $bIsAlpha = False, $bIsGray = False
Global Const $iEntries = 256
Global Const $tagCOLORPALETTE = "uint Flags;" & _               ; Palette flags
                                "uint Count;" & _               ; Number of color entries
                                "uint ARGB[" & $iEntries & "];" ; Palette color

AdlibRegister("AnimateLabel", 60)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $iButton_Exit
            AdlibUnRegister("AnimateLabel")
            GUIDelete($hGui_Preview)
            GUIDelete($hGUI)
            _WinAPI_DeleteObject($hHBmp_L)
            _WinAPI_DeleteObject($hHBmp_C)
            _WinAPI_DeleteObject($hHBmp_L)
            _WinAPI_DeleteObject($hHBmp_R)
            _WinAPI_DeleteObject($hHBmp_G)
            _WinAPI_DeleteObject($hHBmp_B)
            If $hHBmp_Preview Then _WinAPI_DeleteObject($hHBmp_Preview)
            _GDIPlus_PenDispose($hPen_H)
            _GDIPlus_BrushDispose($hTexture_Checkerboard)
            _GDIPlus_GraphicsDispose($hCtxt_HL)
            _GDIPlus_GraphicsDispose($hCtxt_HC)
            _GDIPlus_GraphicsDispose($hCtxt_HR)
            _GDIPlus_GraphicsDispose($hCtxt_HG)
            _GDIPlus_GraphicsDispose($hCtxt_HB)
            _GDIPlus_BitmapDispose($hHBmp_HL)
            _GDIPlus_BitmapDispose($hHBmp_HC)
            _GDIPlus_BitmapDispose($hHBmp_HR)
            _GDIPlus_BitmapDispose($hHBmp_HG)
            _GDIPlus_BitmapDispose($hHBmp_HB)
            _GDIPlus_Shutdown()
            $tStructChannel0 = 0
            $tStructChannel1 = 0
            $tStructChannel2 = 0
            $tStructChannel3 = 0
            Exit
        Case $iRadio_L, $iDummyL
            If $s <> "L" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_L)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "L"
            EndIf
        Case $iRadio_C, $iDummyC
            If $s <> "C" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_C)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HC)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "C"
            EndIf
        Case $iRadio_R, $iDummyR
            If $s <> "R" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_R)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HR)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "R"
            EndIf
        Case $iRadio_G, $iDummyG
            If $s <> "G" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_G)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HG)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "G"
            EndIf
        Case $iRadio_B, $iDummyB
            If $s <> "B" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_B)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HB)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "B"
            EndIf
        Case $iButton_Load
            $sFile = FileOpenDialog("Select  an image", "", "Images (*.jpg;*.png;*.bmp;*.gif)", 3)
            If @error Then ContinueCase
            If $bImgLoaded Then _GDIPlus_ImageDispose($hImage)
            $hImage = _GDIPlus_ImageLoadFromFile($sFile)
            If @error Then
                MsgBox(0x40010, "Error", "Unable to load image", 30)
                ContinueCase
            EndIf
            GUICtrlSetState($iButton_Save, $GUI_ENABLE)
            $aRes = _GDIPlus_ImageGetFlags($hImage)
            If BitAND($aRes[0], $GDIP_IMAGEFLAGS_HASALPHA) Then
                $bIsAlpha = True
            Else
                $bIsAlpha = False
            EndIf
            If BitAND($aRes[0], $GDIP_IMAGEFLAGS_COLORSPACE_GRAY) Then
                $bIsGray = True
            Else
                $bIsGray = False
            EndIf
            $hHBmp_Preview = _GetImage($sFile, $ihGui_PreviewSize, $iBGColor)
            _hBmpToPicControl($iPic_Preview, $hHBmp_Preview, 1)
            If Not $bIsAlpha Then
                $pStructChannel3 = 0
                $iHistogramFormat = $HistogramFormatRGB
            Else
                $pStructChannel3 = DllStructGetPtr($tStructChannel3)
                $iHistogramFormat = $HistogramFormatARGB
            EndIf
            _GDIPlus_BitmapGetHistogram($hImage, $iHistogramFormat, _GDIPlus_BitmapGetHistogramSize($iHistogramFormat), $pStructChannel0, $pStructChannel1, $pStructChannel2, $pStructChannel3)
            _GDIPlus_CreateHistogram()
            $bImgLoaded = True
            If BitAND(GUICtrlRead($iRadio_L), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyL)
            ElseIf BitAND(GUICtrlRead($iRadio_C), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyC)
            ElseIf BitAND(GUICtrlRead($iRadio_R), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyR)
            ElseIf BitAND(GUICtrlRead($iRadio_G), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyG)
            Else
                $s = ""
                GUICtrlSendToDummy($iDummyB)
            EndIf
        Case $iButton_Save
            If $sFile = "" Then ContinueLoop
            $sType = "png"
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HL, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Luminosity." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HC, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_cRGB." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HR, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Red." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HG, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Green." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HB, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Blue." & $sType)
            If $o = 5 Then
                MsgBox(64 + 262144, "Information", "Images properly saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1"), 30, $hGUI)
            Else
                MsgBox(16 + 262144, "Error", "One or more images could not saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1") & ".", 30, $hGUI)
            EndIf
    EndSwitch
    If WinActive($hGUI) Then
        $aMouseInfo = GUIGetCursorInfo($hGUI)
        Switch $aMouseInfo[4]
            Case $iPic_Histogram
                If $bImgLoaded Then
                    $aPos_hWnd = WinGetPos($hGUI)
                    $imp = Max(1, Min(256, -19 + $aMouseInfo[0]))
                    Switch $s
                        Case "L"
                            $iVal = $aLuminosity[$imp]
                        Case "C"
                            $iVal = $aCRGB[$imp]
                        Case "R"
                            $iVal = DllStructGetData($tStructChannel0, "channel0", $imp)
                        Case "G"
                            $iVal = DllStructGetData($tStructChannel1, "channel1", $imp)
                        Case "B"
                            $iVal = DllStructGetData($tStructChannel2, "channel2", $imp)
                    EndSwitch
                    If $iMpos_oldx <> $aMouseInfo[0] Or $iMpos_oldy <> $aMouseInfo[1] Then
                        ToolTip("Index: " & $imp & ", Value: " & Round($iVal, 0) & ", Average: " & Round($fAverage_L, 2), $aPos_hWnd[0] + $aMouseInfo[0] - 60, $aMouseInfo[1] + $aPos_hWnd[1] - 20)
                        $iMpos_oldx = $aMouseInfo[0]
                        $iMpos_oldy = $aMouseInfo[1]
                    EndIf
                    ShowPreview($iPic_Histogram)
                    $bShow = True
                    $bHide = False

                EndIf
            Case Else
                If Not $bHide Then
                    GUISetState(@SW_HIDE, $hGui_Preview)
                    $bHide = True
                    ToolTip("")
                EndIf
                $bShow = False
        EndSwitch
    EndIf
WEnd

Func AnimateLabel()
    Local Static $v = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2)
    Local $u
    For $u = 0 To UBound($aLabelCredit_Pos) - 1
        GUICtrlSetPos($aLabelCredit_Pos[$u][3], $aLabelCredit_Pos[$u][1], $aLabelCredit_AnimPos[$v - $u])
    Next
    If $v - $u < 0 Then $v = UBound($aLabelCredit_AnimPos) - 1
    $v -= 1
EndFunc   ;==>AnimateLabel

Func Min($a, $b)
    If $a < $b Then Return $a
    Return $b
EndFunc   ;==>Min

Func Max($a, $b)
    If $a > $b Then Return $a
    Return $b
EndFunc   ;==>Max

Func ShowPreview($iCtrl)
    $aPosWin = WinGetPos($hGUI)
    $aPosCtrl = ControlGetPos($hGUI, "", $iCtrl)
    Local $iNewX, $iNewX1 = $aPosWin[0] - $ihGui_PreviewSize + 10, $iNewX2 = $aPosWin[0] + $aPosWin[2] - 10
    $iNewX = $iNewX1
    If $iNewX1 < $aFullScreen[0] Then
        $iNewX = $iNewX2
    EndIf
    WinMove($hGui_Preview, "", $iNewX, $aPosWin[1] + 50)
    GUISetState(@SW_SHOWNOACTIVATE, $hGui_Preview)
EndFunc   ;==>ShowPreview

Func _GetImage($sFile, $iWH, $iBkClr = 0xFFFFFF, $bCheckerboard_Bg = True)
    Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS, $hBmp2, $aFTS
    $aFTS = FileGetTime($sFile)
    If @error Then Return SetError(1, 0, 0)
    $hBmp1 = _WinAPI_CreateBitmap($iWH, $iWH, 1, 32)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _WinAPI_DeleteObject($hBmp1)
    $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    GUICtrlSetData($idLabel_Info,  StringRegExpReplace($sFile, ".*\\(.*)", "$1") & @LF & Round(FileGetSize($sFile) / 1024, 0) & " kb (" & $iW & " x " & $iH & ")" & @LF & $aFTS[0] & "/" & $aFTS[1] & "/" & $aFTS[2] & " " & $aFTS[3] & ":" & $aFTS[4] & ":" & $aFTS[5] & @LF & "Alpha: " & $bIsAlpha & ", Gray: " & $bIsGray)
    $aGS = _GetScale($iW, $iH, $iWH)
    Switch $bCheckerboard_Bg
        Case True
;~          _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $iWH, $iWH, $hTexture_Checkerboard)
            _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
            _GDIPlus_GraphicsFillRect($hGraphic, $aGS[0], $aGS[1], $aGS[2], $aGS[3], $hTexture_Checkerboard)
        Case False
            _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
    EndSwitch
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    $hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Return $hBmp2
EndFunc   ;==>_GetImage

Func _GetScale($iW, $iH, $iWH)
    Local $aRet[4]
    If $iW <= $iWH And $iH <= $iWH Then
        $aRet[2] = $iW
        $aRet[3] = $iH
        $aRet[0] = ($iWH - $aRet[2]) / 2
        $aRet[1] = ($iWH - $aRet[3]) / 2
    ElseIf $iW > $iH Then
        $aRet[2] = $iWH
        $aRet[3] = $iH / ($iW / $iWH)
        $aRet[0] = 0
        $aRet[1] = ($iWH - $aRet[3]) / 2
    ElseIf $iW < $iH Then
        $aRet[2] = $iW / ($iH / $iWH)
        $aRet[3] = $iWH
        $aRet[0] = ($iWH - $aRet[2]) / 2
        $aRet[1] = 0
    ElseIf $iW = $iH Then
        $aRet[2] = $iWH
        $aRet[3] = $iWH
        $aRet[0] = 0
        $aRet[1] = 0
    EndIf
    Return $aRet
EndFunc   ;==>_GetScale

Func _hBmpToPicControl($iCID, ByRef $hBmp, $iFlag = 0)
    Local $hOldBmp
    $hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
    If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp)
    If $iFlag Then _WinAPI_DeleteObject($hBmp)
EndFunc   ;==>_hBmpToPicControl

Func _GDIPlus_CreateHistogram($sRounding = "Ceiling")
    Local $iMaxL, $iMaxC, $iMaxR, $iMaxG, $iMaxB, $a, $r, $g, $b, $yR, $yG, $yB, $iRedAv, $iGreenAv, $iBlueAv
    For $i = 1 + $bIsAlpha To 256
        If $bIsAlpha Then
;~          ConsoleWrite("Alpha: " & DllStructGetData($tStructChannel0, "channel0", $i) & @CRLF)
            $r = DllStructGetData($tStructChannel1, "channel1", $i)
            $yR = $r * $frY
            If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxR Then $iMaxR = $r

            $g = DllStructGetData($tStructChannel2, "channel2", $i)
            $yG = $g * $fgY
            If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxG Then $iMaxG = $g

            $b = DllStructGetData($tStructChannel3, "channel3", $i)
            $yB = $b * $fbY
            If DllStructGetData($tStructChannel3 , "channel3", $i) > $iMaxB Then $iMaxB = $b
            $fAverage_cRGB += $r + $g + $b
            $fAverage_L += $yR + $yG + $yB
        Else
            $r = DllStructGetData($tStructChannel0, "channel0", $i)
            $yR = $r * $frY
            If DllStructGetData($tStructChannel0 , "channel0", $i) > $iMaxR Then $iMaxR = $r

            $g = DllStructGetData($tStructChannel1, "channel1", $i)
            $yG = $g * $fgY
            If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxG Then $iMaxG = $g

            $b = DllStructGetData($tStructChannel2, "channel2", $i)
            $yB = $b * $fbY
            If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxB Then $iMaxB = $b
        EndIf

        $fAverage_cRGB += $r + $g + $b
        $fAverage_L += $yR + $yG + $yB

        $aLuminosity[$i] = $yR + $yG + $yB
        If $aLuminosity[$i] > $iMaxL Then $iMaxL = $aLuminosity[$i]

        $aCRGB[$i] = ($r + $g + $b) / 3
        If $aCRGB[$i] > $iMaxC Then $iMaxC = $aCRGB[$i]
    Next
    $fAverage_cRGB /= 256 * 3
    $fAverage_L /= 256

    _GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HC, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HR, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HG, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HB, 0xFFFFFFFF)

    Local $iDL = 1, $iDC = 1, $iDR = 1, $iDG = 1, $iDB = 1
    Local $sRoundings = "Round,Ceiling,Floor,"
    If Not StringInStr($sRoundings, $sRounding) Then $sRounding = "Ceiling"
    If $iMaxL > 128 Then
;~      $iDL = Ceiling($iMaxL / 128)
        $iDL = Execute($sRounding & "(" & $iMaxL / 128 & ")")
    Else
        $iDL = 1 / (128 / $iMaxL)
    EndIf
    If $iMaxC > 128 Then
;~      $iDC = Ceiling($iMaxC / 128)
        $iDC = Execute($sRounding & "(" & $iMaxC / 128 & ")")
    Else
        $iDC = 1 / (128 / $iMaxC)
    EndIf
    If $iMaxR > 128 Then
;~      $iDR = Ceiling($iMaxR / 128)
        $iDR = Execute($sRounding & "(" & $iMaxR / 128 & ")")
    Else
        $iDR = 1 / (128 / $iMaxR)
    EndIf
    If $iMaxG > 128 Then
;~      $iDG = Ceiling($iMaxG / 128)
        $iDG = Execute($sRounding & "(" & $iMaxG / 128 & ")")
    Else
        $iDG = 1 / (128 / $iMaxG)
    EndIf
    If $iMaxB > 128 Then
;~      $iDB = Ceiling($iMaxB / 128)
        $iDB = Execute($sRounding & "(" & $iMaxB / 128 & ")")
    Else
        $iDB = 1 / (128 / $iMaxB)
    EndIf
    For $i = 1 To 256
        _GDIPlus_PenSetColor($hPen_H, 0xFF000000)
        _GDIPlus_GraphicsDrawLine($hCtxt_HL, $i - 1, 127, $i - 1, 127 - (Int($aLuminosity[$i] / $iDL)), $hPen_H)
        _GDIPlus_PenSetColor($hPen_H, 0xFF000000)
        _GDIPlus_GraphicsDrawLine($hCtxt_HC, $i - 1, 127, $i - 1, 127 - (Int($aCRGB[$i] / $iDC)), $hPen_H)
        _GDIPlus_PenSetColor($hPen_H, 0xFFB00000)
        If $bIsAlpha Then
            _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDR)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF00B000)
            _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDG)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0)
            _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel3, "channel3", $i) / $iDB)), $hPen_H)
        Else
            _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel0, "channel0", $i) / $iDR)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF00B000)
            _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDG)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0)
            _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDB)), $hPen_H)
        EndIf
    Next

EndFunc   ;==>_GDIPlus_CreateHistogram

Func _GDIPlus_CreateColorGradient($sColorChannel, $iW, $iH, $bHBitmap = True)
    Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
;~  _GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
    Local $hPen = _GDIPlus_PenCreate()
    _GDIPlus_PenSetLineJoin($hPen, $iLineJoinBevel)
    Local $i, $c
    For $i = 0 To $iW
        $c = Hex($i, 2)
        Switch $sColorChannel
            Case "L"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c)
            Case "C"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c)
            Case "R"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & "0000")
            Case "G"
                _GDIPlus_PenSetColor($hPen, "0xFF00" & $c & "00")
            Case "B"
                _GDIPlus_PenSetColor($hPen, "0xFF0000" & $c)
        EndSwitch
        _GDIPlus_GraphicsDrawLine($hCtxt, $i, 0, $i, $iH, $hPen)
    Next
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_PenDispose($hPen)
    If $bHBitmap Then
        Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>_GDIPlus_CreateColorGradient

Func _GDIPlus_CreateCheckerboardTexture($iSquareSize = 80, $iCol1 = 0xFFECECEC, $iCol2 = 0xFFDFDFDF)
    Local $hPatternBitmap = _GDIPlus_BitmapCreateFromScan0(2 * $iSquareSize, 2 * $iSquareSize)
    Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hPatternBitmap)
    Local $hBrush0 = _GDIPlus_BrushCreateSolid($iCol1)
    Local $hBrush1 = _GDIPlus_BrushCreateSolid($iCol2)
    _GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $iSquareSize, $iSquareSize, $hBrush0)
    _GDIPlus_GraphicsFillRect($hCtxt, $iSquareSize, 0, $iSquareSize, $iSquareSize, $hBrush1)
    _GDIPlus_GraphicsFillRect($hCtxt, 0, $iSquareSize, $iSquareSize, $iSquareSize, $hBrush1)
    _GDIPlus_GraphicsFillRect($hCtxt, $iSquareSize, $iSquareSize, $iSquareSize, $iSquareSize, $hBrush0)
    Local $hTexture = _GDIPlus_TextureCreate($hPatternBitmap)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BitmapDispose($hPatternBitmap)
    _GDIPlus_BitmapDispose($hBrush0)
    _GDIPlus_BitmapDispose($hBrush1)
    Return $hTexture
EndFunc   ;==>_CreatePatternTexture

 

GdipBitmapGetHistogram(), GdipBitmapGetHistogramSize() and 2 more GDI+ functions requires GDI+ v1.1 which means this will only run on Vista or higher operating systems.

I hope the values are correct especially the value for luminosity.

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

impressive, great job.

thanks for sharing UEZ.

I guess it would be nice to also have the historgram of the combined RGB channels.


Contributions

CheckUpdate - SelfUpdating script ------- Self updating script

Dynamic input validation ------------------- Use a Input masks can make your life easier and Validation can be as simple

MsgBox with CountDown ------------------- MsgBox with visual countdown

Display Multiline text cells in ListView ---- Example of pop-up or ToolTip for multiline text items in ListView

Presentation Manager ---------------------- Program to display and refresh different Border-less GUI's on a Display (large screen TV)

USB Drive Tools ------------------------------ Tool to help you with your USB drive management

Input Period udf ------------------------------ GUI for a period input

Excel ColorPicker ---------------------------- Color pickup tool will allow you to select a color from the standard Excel color palette

Excel Chart UDF ----------------------------- Collaboration project with water 

GetDateInString ------------------------------ Find date/time in a string using a date format notation like DD Mon YYYY hh:mm

TaskListAllDetailed --------------------------- List All Scheduled Tasks

Computer Info --------------------------------- A collection of information for helpdesk

Shared memory Demo ----------------------- Demo: Two applications communicate with each other through means of a memory share (using Nomad function, 32bit only)

Universal Date Format Conversion -------- Universal date converter from your PC local date format to any format

Disable Windows DetailsPane -------------- Disable Windows Explorer Details Pane

Oracle SQL Report Generator -------------  Oracle Report generator using SQL

SQLite Report Generator -------------------  SQLite Report generator using SQL

SQLite ListView and BLOB demo ---------- Demo: shows how binary (image) objects can be recognized natively in a database BLOB field

DSN-Less Database connection demo --- Demo: ActiveX Data Objects DSN-Less Database access

Animated animals ----------------------------- Fun: Moving animated objects

Perforated image in GUI --------------------- Fun: Perforate your image with image objects

UEZ's Perforator major update ------------- Fun: Pro version of Perforator by UEZ

Visual Crop Tool (GUI) ----------------------- Easy to use Visual Image Crop tool

Visual Image effect (GUI) -------------------- Visually apply effects on an image

 

 

 

Share this post


Link to post
Share on other sites

Typical UEZ, you solve a problem and then create an example for us, while most of us (me included) create examples and then solve probs.

5 Stars from me...


----------------------------------------

:bye: Hey there, was I helpful?

----------------------------------------

My Current OS: Win8 PRO (64-bit); Current AutoIt Version: v3.3.8.1

Share this post


Link to post
Share on other sites

@all: thank you for your comments. :rolleyes:

@GreenCan: "combined RGB channels" is the luminosity radio button here, isn't it?

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Hi UEZ,

The luminosity (or gray) histogram is calculated with a formula that isolate the brightness from the color information giving a different enphasis to the RGB values. In a way, it is closer to what your eye perceives as brightness.

Formulawise Luminosity is calculated like this: ( 0.299*R + 0.587*G + 0.114*B ), you set the values as constants in line 41 and the formula is used in _GDIPlus_CreateHistogram()

There are also other variants of this formula, but this is good enough.

RGB histogram is the combined average of the RGB values, the formula looks like this: cRGB = ( R + G + B ) / 3

Now comes the stigmatizing part for me …J

I looked into the code, but I don’t quite understand yet how this all works.

Anyhow, You enumerate all the Histogram Formats in line 27 but you don’t seem to use the $HistogramFormatGray format. Maybe the label of the default radio button should then be RGB and not ‘Luminosity’?

I tried to replace $HistogramFormatRGB by $HistogramFormatGray but that does not function, I guess the reason is that $pStructChannel0, $pStructChannel1, $pStructChannel2 should then be set to Null. At least that is what I understand from: http://msdn.microsoft.com/en-us/library/windows/desktop/ms534129(v=vs.85).aspx

A last remark, assuming the default histogram in your script is combined RGB (it looks like this is what you do), the histogram shown is not exactly the RGB one that I see in my Graphic Viewer (FastStone) or in Photoshop. Neither does the Gray histogram corresponds…

The Red, Green and Blue histograms are indeed identical.


Contributions

CheckUpdate - SelfUpdating script ------- Self updating script

Dynamic input validation ------------------- Use a Input masks can make your life easier and Validation can be as simple

MsgBox with CountDown ------------------- MsgBox with visual countdown

Display Multiline text cells in ListView ---- Example of pop-up or ToolTip for multiline text items in ListView

Presentation Manager ---------------------- Program to display and refresh different Border-less GUI's on a Display (large screen TV)

USB Drive Tools ------------------------------ Tool to help you with your USB drive management

Input Period udf ------------------------------ GUI for a period input

Excel ColorPicker ---------------------------- Color pickup tool will allow you to select a color from the standard Excel color palette

Excel Chart UDF ----------------------------- Collaboration project with water 

GetDateInString ------------------------------ Find date/time in a string using a date format notation like DD Mon YYYY hh:mm

TaskListAllDetailed --------------------------- List All Scheduled Tasks

Computer Info --------------------------------- A collection of information for helpdesk

Shared memory Demo ----------------------- Demo: Two applications communicate with each other through means of a memory share (using Nomad function, 32bit only)

Universal Date Format Conversion -------- Universal date converter from your PC local date format to any format

Disable Windows DetailsPane -------------- Disable Windows Explorer Details Pane

Oracle SQL Report Generator -------------  Oracle Report generator using SQL

SQLite Report Generator -------------------  SQLite Report generator using SQL

SQLite ListView and BLOB demo ---------- Demo: shows how binary (image) objects can be recognized natively in a database BLOB field

DSN-Less Database connection demo --- Demo: ActiveX Data Objects DSN-Less Database access

Animated animals ----------------------------- Fun: Moving animated objects

Perforated image in GUI --------------------- Fun: Perforate your image with image objects

UEZ's Perforator major update ------------- Fun: Pro version of Perforator by UEZ

Visual Crop Tool (GUI) ----------------------- Easy to use Visual Image Crop tool

Visual Image effect (GUI) -------------------- Visually apply effects on an image

 

 

 

Share this post


Link to post
Share on other sites

Thanks for the clarification. I've no knowledge in this kind of graphical stuff but it should be easy to add cRGB = ( R + G + B ) / 3 to display the combined RGB.

Regarding the luminosity: I compared it also with some other tools and it looks sometimes different. Let me check this again ...

Thanks four your feedback.

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

@GreenCan: I added cRGB and modified the calculation for luminosity. Can you check whether it fits now better?

Luminosity looks similar to cRGB...

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

This is perfect UEZ.

The histograms match perfectly now. Good show!

And I like your wave too :thumbsup:

What OS are you running on?

When I run the script on Windows 7 64bit, the histograms are shown, but if I do the same on a W7 32bit, I don't see the histogram.

If this is correct I would change line 23 as follows:

[/autoit][autoit]If @OSBuild < 6000 Or @OSArch = "X86" Then Exit MsgBox(0x40010, "Error", "GDI+ Show Histogram can run on 64bit operating systems Vista or newer only!")

Thanks

GreenCan


Contributions

CheckUpdate - SelfUpdating script ------- Self updating script

Dynamic input validation ------------------- Use a Input masks can make your life easier and Validation can be as simple

MsgBox with CountDown ------------------- MsgBox with visual countdown

Display Multiline text cells in ListView ---- Example of pop-up or ToolTip for multiline text items in ListView

Presentation Manager ---------------------- Program to display and refresh different Border-less GUI's on a Display (large screen TV)

USB Drive Tools ------------------------------ Tool to help you with your USB drive management

Input Period udf ------------------------------ GUI for a period input

Excel ColorPicker ---------------------------- Color pickup tool will allow you to select a color from the standard Excel color palette

Excel Chart UDF ----------------------------- Collaboration project with water 

GetDateInString ------------------------------ Find date/time in a string using a date format notation like DD Mon YYYY hh:mm

TaskListAllDetailed --------------------------- List All Scheduled Tasks

Computer Info --------------------------------- A collection of information for helpdesk

Shared memory Demo ----------------------- Demo: Two applications communicate with each other through means of a memory share (using Nomad function, 32bit only)

Universal Date Format Conversion -------- Universal date converter from your PC local date format to any format

Disable Windows DetailsPane -------------- Disable Windows Explorer Details Pane

Oracle SQL Report Generator -------------  Oracle Report generator using SQL

SQLite Report Generator -------------------  SQLite Report generator using SQL

SQLite ListView and BLOB demo ---------- Demo: shows how binary (image) objects can be recognized natively in a database BLOB field

DSN-Less Database connection demo --- Demo: ActiveX Data Objects DSN-Less Database access

Animated animals ----------------------------- Fun: Moving animated objects

Perforated image in GUI --------------------- Fun: Perforate your image with image objects

UEZ's Perforator major update ------------- Fun: Pro version of Perforator by UEZ

Visual Crop Tool (GUI) ----------------------- Easy to use Visual Image Crop tool

Visual Image effect (GUI) -------------------- Visually apply effects on an image

 

 

 

Share this post


Link to post
Share on other sites

I just checked the code in my vm running Vista x64 and saw that it didn't work properly. I added _GDIPlus11_Startup() which loads the DLL appropriately and now it runs also on Vista x64 (thanks to Authenticity for the code). I don't have x86 installed to test.

My main os is Win7 x64 with Aero enabled.

Btw, I don't know what I should do with the information about the histogram information...

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

Btw, I don't know what I should do with the information about the histogram information...

There are many application for this kind of the histogram information.

Let's have a look on the this article:

http://io9.com/5060911/magnetic-anomaly-map-of-the-world

There, red indicates a stronger magnetic tug, and blue a weaker one (white lines are the edges of tectonic plates). As you can see, disturbances are fairly regularly distributed, but that doesn't stop UFO enthusiasts from saying aliens have a hand in these magnetic fluctuations. Science, however, has a slightly different explanation for why certain objects (including submarines) create a shift in the magnetic field.According to the Geological Survey of Finland, which created the map out of years of survey research:

Posted Image

Now you can help UFO enthusiasts and scientists to research the Magnetic Anomaly of the World.

:thumbsup:


The point of world view

Share this post


Link to post
Share on other sites

This is truly amazing UEZ!

For me the next logical step would be the Effects Class in GDIPlus v1.1.

With the histogram we could apply 'Levels' or 'Colorcurve' maybe?

Authenticity already started this a while back but I found there was one Dllcall that I needed missing...

(My first dllcall so please correct any mistakes)

Func _GDIPlus_EffectsSetParameters($hEffectObject, $pEffectParameters)

Local $aSize = DllCall($ghGDIPDll, "uint", "GdipGetEffectParameterSize", "hwnd", $hEffectObject, "uint*", 0)
Local $size = $aSize[2]
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetEffectParameters", "hwnd", $hEffectObject, "ptr", $pEffectParameters, "uint", $size)

If @error Then Return SetError(@error, @extended, 0)

Return SetError($aResult[0], 0, $aResult[3])
EndFunc

Here's a very quick and simple example (excuse the messy code!)

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

Global Const $GDIP_BLUREFFECT = "{633C80A4-1843-482b-9EF2-BE2834C5FDD4}"
Global Const $GDIP_SHARPENEFFECT = "{63CBF3EE-C526-402c-8F71-62C540BF5142}"
Global Const $GDIP_COLORMATRIXEFFECT = "{718F2615-7933-40e3-A511-5F68FE14DD74}"
Global Const $GDIP_COLORLUTEFFECT = "{A7CE72A9-0F7F-40d7-B3CC-D0C02D5C3212}"
Global Const $GDIP_BRIGHTNESSCONTRASTEFFECT = "{D3A1DBE1-8EC4-4c17-9F4C-EA97AD1C343D}"
Global Const $GDIP_HUESATURATIONLIGHTNESSEFFECT = "{8B2DD6C3-EB07-4d87-A5F0-7108E26A9C5F}"
Global Const $GDIP_LEVELSEFFECT = "{99C354EC-2A31-4f3a-8C34-17A803B33A25}"
Global Const $GDIP_TINTEFFECT = "{1077AF00-2848-4441-9489-44AD4C2D7A2C}"
Global Const $GDIP_COLORBALANCEEFFECT = "{537E597D-251E-48da-9664-29CA496B70F8}"
Global Const $GDIP_REDEYECORRECTIONEFFECT = "{74D29D05-69A4-4266-9549-3CC52836B632}"
Global Const $GDIP_COLORCURVEEFFECT = "{DD6A0022-58E4-4a67-9D9B-D48EB881A53D}"
Global Enum _
$AdjustExposure = 0, _
$AdjustDensity = 1, _
$AdjustContrast = 2, _
$AdjustHighlight = 3, _
$AdjustShadow = 4, _
$AdjustMidtone = 5, _
$AdjustWhiteSaturation = 6, _
$AdjustBlackSaturation = 7
Global Enum _
$CurveChannelAll = 0, _
$CurveChannelRed = 1, _
$CurveChannelGreen = 2, _
$CurveChannelBlue = 3

Local $file = @ScriptDir & "\Test.jpg"
Global $highlight, $midtone, $shadow
$type = $AdjustExposure
$channel = $CurveChannelAll
$value = 100
Global $LevelsParams = DllStructCreate("int type;int channel;int value")
Global $pLevelsParams = DllStructGetPtr($LevelsParams)
DllStructSetData($LevelsParams, "type", $AdjustHighlight)
DllStructSetData($LevelsParams, "channel", $CurveChannelAll)
DllStructSetData($LevelsParams, "value", 90)

_GDIPlus_Startup()
If @error Then Exit MsgBox(0x10, "Error", "GDIPlus v1.1 is not installed")
Local $hGUI, $hGraphics, $hImage, $hAlteredImage, $hEffect
$hGUI = GUICreate("", 1400, 800)
GUISetState()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hImage = _GDIPlus_ImageLoadFromFile($file)

_GDIPlus_GraphicsDrawImage($hGraphics, $hImage, 0, 0)
Sleep(2000)
$hEffect = _GDIPlus_EffectCreate($GDIP_COLORCURVEEFFECT)
_GDIPlus_EffectsSetParameters($hEffect, $pLevelsParams)
$hAlteredImage = _GDIPlus_BitmapCreateWithEffect($hImage, $hEffect)
_GDIPlus_GraphicsDrawImage($hGraphics, $hAlteredImage, 0, 0)

Do
Until GUIGetMsg() = -3
_GDIPlus_BitmapDispose($hAlteredImage)
_GDIPlus_EffectDispose($hEffect)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

Func _GDIPlus_EffectsSetParameters($hEffectObject, $pEffectParameters)
Local $aSize = DllCall($ghGDIPDll, "uint", "GdipGetEffectParameterSize", "hwnd", $hEffectObject, "uint*", 0)
Local $size = $aSize[2]
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetEffectParameters", "hwnd", $hEffectObject, "ptr", $pEffectParameters, "uint", $size)
If @error Then Return SetError(@error, @extended, 0)
Return SetError($aResult[0], 0, $aResult[3])
EndFunc
;Following functions written by Authenticity (Thank You!)
Func _GDIPlus_BitmapApplyEffect($hBitmap, $hEffect, $pROI = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapApplyEffect", "hwnd", $hBitmap, "hwnd", $hEffect, "ptr", $pROI, "int", 0, "ptr*", 0, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)

Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc
Func _GDIPlus_BitmapCreateWithEffect($hBitmap, $hEffect, $pROI = 0, $pOutRect = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapCreateApplyEffect", "ptr*", $hBitmap, "int", 1, "hwnd", $hEffect, "ptr", $pROI, "ptr", $pOutRect, "int*", 0, "int", 0, "ptr*", 0, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
Return SetError($aResult[0], 0, $aResult[6])
EndFunc
Func _GDIPlus_EffectCreate($sEffectGUID)
Local $iI, $tGUID, $pGUID, $tElem, $aElem[4], $aResult
$tGUID = _WinAPI_GUIDFromString($sEffectGUID)
$pGUID = DllStructGetPtr($tGUID)
$tElem = DllStructCreate("int[4]", $pGUID)
For $iI = 1 To 4
     $aElem[$iI-1] = DllStructGetData($tElem, 1, $iI)
Next

$aResult = DllCall($ghGDIPDll, "uint", "GdipCreateEffect", "int", $aElem[0], "int", $aElem[1], "int", $aElem[2], "int", $aElem[3], "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
Return SetError($aResult[0], 0, $aResult[5])
EndFunc
Func _GDIPlus_EffectDispose($hEffect)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeleteEffect", "hwnd", $hEffect)
If @error Then Return SetError(@error, @extended, 0)
Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc

#cs
Func _GDIPlus11_Startup()
Local $pInput, $tInput, $pToken, $tToken, $aResult
$giGDIPRef += 1
If $giGDIPRef > 1 Then Return True
$ghGDIPDll = DllOpen(@WindowsDir & "\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.9200.16384_none_ba245425e0986353\gdiplus.dll")
;$ghGDIPDll = DllOpen(@WindowsDir & "\winsxs\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.6000.16386_none_8df21b8362744ace\gdiplus.dll")
_WinAPI_Check("_GDIPlus_Startup (GDIPlus.dll not found)", @error, False)
$tInput = DllStructCreate($tagGDIPSTARTUPINPUT)
$pInput = DllStructGetPtr($tInput)
$tToken = DllStructCreate("int Data")
$pToken = DllStructGetPtr($tToken)
DllStructSetData($tInput, "Version", 1)
$aResult = DllCall($ghGDIPDll, "int", "GdiplusStartup", "ptr", $pToken, "ptr", $pInput, "ptr", 0)
If @error Then Return SetError(@error, @extended, False)
$giGDIPToken = DllStructGetData($tToken, "Data")
Return $aResult[0] == 0
EndFunc
Func _GDIPlus11_Shutdown()
If $ghGDIPDll = 0 Then Return SetError(-1, -1, False)
$giGDIPRef -= 1
If $giGDIPRef = 0 Then
     DllCall($ghGDIPDll, "none", "GdiplusShutdown", "ptr", $giGDIPToken)
     DllClose($ghGDIPDll)
     $ghGDIPDll = 0
EndIf
Return True
EndFunc
Func _WinAPI_Check($sFunction, $fError, $vError, $fTranslate = False)
If $fError Then
If $fTranslate Then $vError = _WinAPI_GetLastErrorMessage()
_WinAPI_ShowError($sFunction & ": " & $vError)
EndIf
EndFunc ;==>_WinAPI_Check
#ce

Share this post


Link to post
Share on other sites

@Jardz: I started this already some month ago but failed to modify e.g. settings for blur. It applies always the same settings although I change the values.

But this issue will highjack this topic.

Maybe you open a new thread and we can try to figure it out there.

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

I found my mistake. :)

Here what I got so far:

 

I don't know how you want to use the histogram for the color effects you mentioned above.

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

@UEZ, Glad you got it sorted! Nice set of examples as always :)

Don't want to drift off thread topic but with regards the histogram, I was thinking about three adjustments in colorcurves; Values set by dragging pointers under the histogram (same as Photoshop, gimp etc)

Was also considering simple calculations for auto adjusting...Might have to revisit calculus :wacko:

Extract from http://gdiplus.ru/gdiplus/gdiplusreference/enumerations/curveadjustments.htm

AdjustMidtone

Lightens or darkens an image. Color channel values in the middle of the intensity range are altered more than color channel values near the minimum or maximum intensity. You can use this adjustment to lighten (or darken) an image without loosing the contrast between the darkest and lightest portions of the image. When you set the adjustment member of a ColorCurveParams object to AdjustMidtone, you should set the adjustValue member to an integer in the range -100 through 100. A value of 0 specifies no change. Positive values specify that the midtones are made lighter, and negative values specify that the midtones are made darker.

AdjustWhiteSaturation

When you set the adjustment member of a ColorCurveParams object to AdjustWhiteSaturation, you should set the adjustValue member to an integer in the range 0 through 255. A value of t specifies that the interval [0, t] is mapped linearly to the interval [0, 255]. For example, if adjustValue is equal to 240, then color channel values in the interval [0, 240] are adjusted so that they spread out over the interval [0, 255]. Color channel values greater than 240 are set to 255.

AdjustBlackSaturation

When you set the adjustment member of a ColorCurveParams object to AdjustBlackSaturation, you should set the adjustValue member to an integer in the range 0 through 255. A value of t specifies that the interval [t, 255] is mapped linearly to the interval [0, 255]. For example, if adjustValue is equal to 15, then color channel values in the interval [15, 255] are adjusted so that they spread out over the interval [0, 255]. Color channel values less than 15 are set to 0.

Share this post


Link to post
Share on other sites

Here a little tool to display the histogram of an image (inspired by this thread: )

post-29844-0-08200900-1359724336_thumb.p

#AutoIt3Wrapper_Compile_Both=y
://////=__=
://////=__=+
://////=__=
#AutoIt3Wrapper_Res_Fileversion=0.9.7.0
://////=__=--
#AutoIt3Wrapper_Res_LegalCopyright=UEZ Software Development
#AutoIt3Wrapper_Res_Language=1033
://////=__=://.=.com/forum/index.php?showtopic=147777
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/om /sv /sf /cs=0 /cn=0
#AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_Obfuscated.au3"
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_UPX_Parameters=--best --lzma

#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>

Opt("MustDeclareVars", 1)
Opt("MouseCoordMode", 2)

_GDIPlus11_Startup()
If @error Then Exit MsgBox(0x40010, "Error", "GDI+ Show Histogram can run on operating systems Vista or newer only!")

Global Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]")
Global Const $aFullScreen = WinGetPos($hFullScreen)

Global Enum $HistogramFormatARGB, $HistogramFormatPARGB, $HistogramFormatRGB, $HistogramFormatGray, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534129(v=vs.85).aspx
        $HistogramFormatB, $HistogramFormatG, $HistogramFormatR, $HistogramFormatA

Global Enum $DitherTypeNone = 0, $DitherTypeSolid, $DitherTypeOrdered4x4, $DitherTypeOrdered8x8, $DitherTypeOrdered16x16, $DitherTypeOrdered91x91, _
                            $DitherTypeSpiral4x4, $DitherTypeSpiral8x8, $DitherTypeDualSpiral4x4, $DitherTypeDualSpiral8x8, $DitherTypeErrorDiffusion
Global Enum $PaletteTypeCustom = 0, $PaletteTypeOptimal, $PaletteTypeFixedBW, $PaletteTypeFixedHalftone8, $PaletteTypeFixedHalftone27, $PaletteTypeFixedHalftone64, _
                            $PaletteTypeFixedHalftone125, $PaletteTypeFixedHalftone216, $PaletteTypeFixedHalftone252, $PaletteTypeFixedHalftone256

;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534136(v=vs.85).aspx
Global Const $ImageFlagsNone = 0
Global Const $ImageFlagsScalable = 0x0001
Global Const $ImageFlagsHasAlpha = 0x0002
Global Const $ImageFlagsHasTranslucent = 0x0004
Global Const $ImageFlagsPartiallyScalable = 0x0008
Global Const $ImageFlagsColorSpaceRGB = 0x0010
Global Const $ImageFlagsColorSpaceCMYK = 0x0020
Global Const $ImageFlagsColorSpaceGRAY = 0x0040
Global Const $ImageFlagsColorSpaceYCBCR = 0x0080
Global Const $ImageFlagsColorSpaceYCCK = 0x0100
Global Const $ImageFlagsHasRealDPI = 0x1000
Global Const $ImageFlagsHasRealPixelSize = 0x2000
Global Const $ImageFlagsReadOnly = 0x00010000
Global Const $ImageFlagsCaching = 0x00020000

Global $tStructChannel0 = DllStructCreate("uint channel0[256]")
Global $pStructChannel0 = DllStructGetPtr($tStructChannel0)
Global $tStructChannel1 = DllStructCreate("uint channel1[256]")
Global $pStructChannel1 = DllStructGetPtr($tStructChannel1)
Global $tStructChannel2 = DllStructCreate("uint channel2[256]")
Global $pStructChannel2 = DllStructGetPtr($tStructChannel2)
Global $tStructChannel3 = DllStructCreate("uint channel3[256]")
Global $pStructChannel3 = DllStructGetPtr($tStructChannel3)

Global $s, $sFile, $hImage, $bImgLoaded = False, $aLuminosity[257], $aCRGB[257]
Global Const $STM_SETIMAGE = 0x0172, $iLineJoinBevel = 1, $frY = 0.299, $fgY = 0.587, $fbY = 0.114

Global Const $hGUI = GUICreate("GDI+ Show Histogram v0.97 beta by UEZ build 2013-02-05", 468, 310, -1, -1, Default, Default)
Global Const $sLabel_Titel_Txt = "GDI+ Show Histogram"
Global Const $iPosX_Label = 20, $iPosY_Label = 12
Global Const $iLabel_Titel_Shadow = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label, $iPosY_Label, 429, 57)
GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4)
GUICtrlSetColor(-1, 0xC0C0D8)
Global Const $iLabel_Titel = GUICtrlCreateLabel($sLabel_Titel_Txt, $iPosX_Label - 4, $iPosY_Label - 4, 429, 57)
GUICtrlSetFont(-1, 30, 400, 0, "Comic Sans MS", 4)
GUICtrlSetColor(-1, 0x0000C0)
GUICtrlSetBkColor(-1, -2)
Global Const $iPic_Histogram = GUICtrlCreatePic("", 20, 90, 255, 127, -1, $WS_EX_STATICEDGE)
GUICtrlSetCursor(-1, 14)
Global Const $iPic_ColorGradient = GUICtrlCreatePic("", 20, 220, 255, 24, -1, $WS_EX_STATICEDGE)

Global Const $iGroup = GUICtrlCreateGroup("Channel", 290, 84, 160, 164)
Global Const $iRadio_L = GUICtrlCreateRadio("Luminosit&y (gray)", 300, 100, 110, 20)
GUICtrlSetTip(-1, $frY & "*R, " & $fgY & "*G, " & $fbY & "*B")
GUICtrlSetState($iRadio_L, $GUI_CHECKED)
Global Const $iRadio_C = GUICtrlCreateRadio("&cRGB", 300, 130, 60, 20)
GUICtrlSetTip(-1, "Combined average of RGB values")
Global Const $iRadio_R = GUICtrlCreateRadio("&Red", 300, 160, 60, 20)
Global Const $iRadio_G = GUICtrlCreateRadio("&Green", 300, 190, 60, 20)
Global Const $iRadio_B = GUICtrlCreateRadio("&Blue", 300, 220, 60, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global Const $iButton_Save = GUICtrlCreateButton("&Save", 209, 265, 70, 30)
GUICtrlSetTip(-1, "Click button to save all histogram images")
GUICtrlSetState(-1, $GUI_DISABLE)
Global Const $iButton_Load = GUICtrlCreateButton("&Load", 290, 265, 70, 30)
GUICtrlSetTip(-1, "Click button to load an image")
Global Const $iButton_Exit = GUICtrlCreateButton("E&xit", 390, 265, 60, 30)

Global $sLabelCredit_Txt = "coded by UEZ'13"
Global $aLabelCredit_Pos[StringLen($sLabelCredit_Txt)][4], $u, $iFS = 6.5, $iY = 280
For $u = 0 To UBound($aLabelCredit_Pos) - 1
    $aLabelCredit_Pos[$u][0] = StringMid($sLabelCredit_Txt, $u + 1, 1)
    $aLabelCredit_Pos[$u][1] = 20 + $u * ($iFS - 0.25)
    $aLabelCredit_Pos[$u][2] = $iY
    $aLabelCredit_Pos[$u][3] = GUICtrlCreateLabel($aLabelCredit_Pos[$u][0], $aLabelCredit_Pos[$u][1], $aLabelCredit_Pos[$u][2], $iFS, $iFS * 1.8)
    GUICtrlSetFont(-1, $iFS, 400, 0, "Comic Sans MS", 2)
    GUICtrlSetColor(-1, 0x006000)
Next
Global $aLabelCredit_AnimPos[300]
For $u = 0 To UBound($aLabelCredit_AnimPos) - 1
    $aLabelCredit_AnimPos[$u] = $iY
Next
Global Const $fLimes = 2.2, $fStep = 0.1
Global $iPT = 0, $z = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2)
For $u = 0 To $fLimes Step $fStep
    $aLabelCredit_AnimPos[$z] = $iY + Sin($iPT * 4) * 10
    $z += 1
    $iPT += 0.075
Next

Global $ihGui_PreviewSize = 200, $iBGColor = 0xF0F0F0
Global $hGui_Preview = GUICreate("", $ihGui_PreviewSize, $ihGui_PreviewSize + 58, -1, -1, $WS_POPUP + $WS_BORDER, $WS_EX_TOPMOST, $hGUI)
Global $iPic_Preview = GUICtrlCreatePic("", 0, 0, $ihGui_PreviewSize, $ihGui_PreviewSize)
Global $idLabel_Info = GUICtrlCreateLabel("", 0, $ihGui_PreviewSize, $ihGui_PreviewSize * 2, 58)
GUICtrlSetFont(-1, 8.5, 400, 0, "Arial", 5)
GUICtrlSetColor(-1, $iBGColor)
GUICtrlSetBkColor(-1, 0x333333)

Global $hHBmp_L = _GDIPlus_CreateColorGradient("L", 256, 24)
Global $hHBmp_C = _GDIPlus_CreateColorGradient("C", 256, 24)
Global $hHBmp_R = _GDIPlus_CreateColorGradient("R", 256, 24)
Global $hHBmp_G = _GDIPlus_CreateColorGradient("G", 256, 24)
Global $hHBmp_B = _GDIPlus_CreateColorGradient("B", 256, 24)
Global $aRes = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", 256, "int", 127, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
Global Const $hHBmp_HL = $aRes[6]
Global Const $hCtxt_HL = _GDIPlus_ImageGetGraphicsContext($hHBmp_HL)
Global Const $hHBmp_HC = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HC = _GDIPlus_ImageGetGraphicsContext($hHBmp_HC)
Global Const $hHBmp_HR = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HR = _GDIPlus_ImageGetGraphicsContext($hHBmp_HR)
Global Const $hHBmp_HG = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HG = _GDIPlus_ImageGetGraphicsContext($hHBmp_HG)
Global Const $hHBmp_HB = _GDIPlus_BitmapCloneArea($hHBmp_HL, 0, 0, 256, 127, 0x0026200A)
Global Const $hCtxt_HB = _GDIPlus_ImageGetGraphicsContext($hHBmp_HB)
_GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF)

_hBmpToPicControl($iPic_ColorGradient, $hHBmp_L)

Global $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL)
_hBmpToPicControl($iPic_Histogram, $hB_H, 1)

GUISetState(@SW_HIDE, $hGui_Preview)
GUISetState(@SW_SHOW, $hGUI)
ControlFocus($hGUI, "", $iButton_Load)

Global $hPen_H = _GDIPlus_PenCreate()

$s = "L"
Global $iDummyL = GUICtrlCreateDummy(), $iDummyC = GUICtrlCreateDummy(), $iDummyR = GUICtrlCreateDummy(), $iDummyG = GUICtrlCreateDummy(), $iDummyB = GUICtrlCreateDummy()
Global $iHistogramFormat, $hHBmp_Preview, $aPosCtrl, $aPosWin, $aMouseInfo, $aPos_hWnd, $imp, $iVal, $iMpos_oldx, $iMpos_oldy, $sType, $iPaletteType, $iPixelFormat, $fAverage_L, $fAverage_cRGB, $o = 0
Global $bShow = False, $bHide = False, $bIsAlpha = False, $bIsGray = False
Global Const $iEntries = 1024
Global Const $tagCOLORPALETTE = "uint Flags;" & _       ; Palette flags
                                                                            "uint Count;" & _   ; Number of color entries
                                                                            "uint ARGB[" & $iEntries & "];" ; Palette color

$iPaletteType = $PaletteTypeFixedHalftone8
$iPixelFormat = $GDIP_PXF08INDEXED
Global $tPalette = DllStructCreate($tagCOLORPALETTE)
DllStructSetData($tPalette, "Flags", $iPaletteType)
DllStructSetData($tPalette, "Count", $iEntries)
Global $pPalette = DllStructGetPtr($tPalette)
DllCall($ghGDIPDll, "int", "GdipInitializePalette", "struct*", $pPalette, "long", $iPaletteType, "int", 0, "bool", True, "handle", 0)

AdlibRegister("AnimateLabel", 60)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $iButton_Exit
            AdlibUnRegister("AnimateLabel")
            GUIDelete($hGui_Preview)
            GUIDelete($hGUI)
            _WinAPI_DeleteObject($hHBmp_L)
            _WinAPI_DeleteObject($hHBmp_C)
            _WinAPI_DeleteObject($hHBmp_L)
            _WinAPI_DeleteObject($hHBmp_R)
            _WinAPI_DeleteObject($hHBmp_G)
            _WinAPI_DeleteObject($hHBmp_B)
            If $hHBmp_Preview Then _WinAPI_DeleteObject($hHBmp_Preview)
            _GDIPlus_PenDispose($hPen_H)
            _GDIPlus_GraphicsDispose($hCtxt_HL)
            _GDIPlus_GraphicsDispose($hCtxt_HC)
            _GDIPlus_GraphicsDispose($hCtxt_HR)
            _GDIPlus_GraphicsDispose($hCtxt_HG)
            _GDIPlus_GraphicsDispose($hCtxt_HB)
            _GDIPlus_BitmapDispose($hHBmp_HL)
            _GDIPlus_BitmapDispose($hHBmp_HC)
            _GDIPlus_BitmapDispose($hHBmp_HR)
            _GDIPlus_BitmapDispose($hHBmp_HG)
            _GDIPlus_BitmapDispose($hHBmp_HB)
            _GDIPlus_Shutdown()
            $tStructChannel0 = 0
            $tStructChannel1 = 0
            $tStructChannel2 = 0
            $tStructChannel3 = 0
            Exit
        Case $iRadio_L, $iDummyL
            If $s <> "L" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_L)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HL)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "L"
            EndIf
        Case $iRadio_C, $iDummyC
            If $s <> "C" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_C)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HC)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "C"
            EndIf
        Case $iRadio_R, $iDummyR
            If $s <> "R" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_R)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HR)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "R"
            EndIf
        Case $iRadio_G, $iDummyG
            If $s <> "G" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_G)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HG)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "G"
            EndIf
        Case $iRadio_B, $iDummyB
            If $s <> "B" Then
                _hBmpToPicControl($iPic_ColorGradient, $hHBmp_B)
                If $bImgLoaded Then
                    $hB_H = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hHBmp_HB)
                    _hBmpToPicControl($iPic_Histogram, $hB_H, 1)
                EndIf
                $s = "B"
            EndIf
        Case $iButton_Load
            $sFile = FileOpenDialog("Select an image", "", "Images (*.jpg;*.png;*.bmp;*.gif)", 3)
            If @error Then ContinueCase
            If $bImgLoaded Then _GDIPlus_ImageDispose($hImage)
            $hImage = _GDIPlus_ImageLoadFromFile($sFile)
            If @error Then
                MsgBox(0x40010, "Error", "Unable to load image", 30)
                ContinueCase
            EndIf
            GUICtrlSetState($iButton_Save, $GUI_ENABLE)
            $aRes = DllCall($ghGDIPDll, "int", "GdipGetImageFlags", "handle", $hImage, "uint*", 0)
            If BitAND($aRes[2], $ImageFlagsHasAlpha) Then
                $bIsAlpha = True
            Else
                $bIsAlpha = False
            EndIf
            If BitAND($aRes[2], $ImageFlagsColorSpaceGRAY) Then
                $bIsGray = True
            Else
                $bIsGray = False
            EndIf
            $hHBmp_Preview = _GetImage($sFile, $ihGui_PreviewSize, $iBGColor)
            _hBmpToPicControl($iPic_Preview, $hHBmp_Preview, 1)
            If Not $bIsAlpha Then
                $pStructChannel3 = 0
                $iHistogramFormat = $HistogramFormatRGB
            Else
                $pStructChannel3 = DllStructGetPtr($tStructChannel3)
                $iHistogramFormat = $HistogramFormatARGB
            EndIf
            _GDIPlus_BitmapGetHistogram($hImage, $iHistogramFormat, _GDIPlus_BitmapGetHistogramSize($iHistogramFormat), $pStructChannel0, $pStructChannel1, $pStructChannel2, $pStructChannel3)
            _GDIPlus_CreateHistogram()
            $bImgLoaded = True
            If BitAND(GUICtrlRead($iRadio_L), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyL)
            ElseIf BitAND(GUICtrlRead($iRadio_C), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyC)
            ElseIf BitAND(GUICtrlRead($iRadio_R), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyR)
            ElseIf BitAND(GUICtrlRead($iRadio_G), $GUI_CHECKED) Then
                $s = ""
                GUICtrlSendToDummy($iDummyG)
            Else
                $s = ""
                GUICtrlSendToDummy($iDummyB)
            EndIf
        Case $iButton_Save
            If $sFile = "" Then ContinueLoop
            $sType = "png"
            DllCall($ghGDIPDll, "int", "GdipBitmapConvertFormat", "handle", $hHBmp_HL, "long", $iPixelFormat, "long", $DitherTypeSolid, "long", $iPaletteType, "struct*", $pPalette, "float", 0.0)
            DllCall($ghGDIPDll, "int", "GdipBitmapConvertFormat", "handle", $hHBmp_HC, "long", $iPixelFormat, "long", $DitherTypeSolid, "long", $iPaletteType, "struct*", $pPalette, "float", 0.0)
            DllCall($ghGDIPDll, "int", "GdipBitmapConvertFormat", "handle", $hHBmp_HR, "long", $iPixelFormat, "long", $DitherTypeSolid, "long", $iPaletteType, "struct*", $pPalette, "float", 0.0)
            DllCall($ghGDIPDll, "int", "GdipBitmapConvertFormat", "handle", $hHBmp_HG, "long", $iPixelFormat, "long", $DitherTypeSolid, "long", $iPaletteType, "struct*", $pPalette, "float", 0.0)
            DllCall($ghGDIPDll, "int", "GdipBitmapConvertFormat", "handle", $hHBmp_HB, "long", $iPixelFormat, "long", $DitherTypeSolid, "long", $iPaletteType, "struct*", $pPalette, "float", 0.0)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HL, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Luminosity." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HC, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_cRGB." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HR, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Red." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HG, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Green." & $sType)
            $o += _GDIPlus_ImageSaveToFile($hHBmp_HB, StringRegExpReplace($sFile, "(.*)\..*", "$1") & "_Blue." & $sType)
            If $o = 5 Then
                MsgBox(64 + 262144, "Information", "Images properly saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1"), 30, $hGUI)
            Else
                MsgBox(16 + 262144, "Error", "One or more images could not saved to " & StringRegExpReplace($sFile, "(.*)\\.*", "$1") & ".", 30, $hGUI)
            EndIf
    EndSwitch
    If WinActive($hGUI) Then
        $aMouseInfo = GUIGetCursorInfo($hGUI)
        Switch $aMouseInfo[4]
            Case $iPic_Histogram
                If $bImgLoaded Then
                    $aPos_hWnd = WinGetPos($hGUI)
                    $imp = Max(1, Min(256, -19 + $aMouseInfo[0]))
                    Switch $s
                        Case "L"
                            $iVal = $aLuminosity[$imp]
                        Case "C"
                            $iVal = $aCRGB[$imp]
                        Case "R"
                            $iVal = DllStructGetData($tStructChannel0, "channel0", $imp)
                        Case "G"
                            $iVal = DllStructGetData($tStructChannel1, "channel1", $imp)
                        Case "B"
                            $iVal = DllStructGetData($tStructChannel2, "channel2", $imp)
                    EndSwitch
                    If $iMpos_oldx <> $aMouseInfo[0] Or $iMpos_oldy <> $aMouseInfo[1] Then
                        ToolTip("Index: " & $imp & ", Value: " & Round($iVal, 0) & ", Average: " & Round($fAverage_L, 2), $aPos_hWnd[0] + $aMouseInfo[0] - 60, $aMouseInfo[1] + $aPos_hWnd[1] - 20)
                        $iMpos_oldx = $aMouseInfo[0]
                        $iMpos_oldy = $aMouseInfo[1]
                    EndIf
                    ShowPreview($iPic_Histogram)
                    $bShow = True
                    $bHide = False

                EndIf
            Case Else
                If Not $bHide Then
                    GUISetState(@SW_HIDE, $hGui_Preview)
                    $bHide = True
                    ToolTip("")
                EndIf
                $bShow = False
        EndSwitch
    EndIf
WEnd

Func AnimateLabel()
    Local Static $v = Int((UBound($aLabelCredit_AnimPos) - ($fLimes * $fStep * 100)) / 2)
    Local $u
    For $u = 0 To UBound($aLabelCredit_Pos) - 1
        GUICtrlSetPos($aLabelCredit_Pos[$u][3], $aLabelCredit_Pos[$u][1], $aLabelCredit_AnimPos[$v - $u])
    Next
    If $v - $u < 0 Then $v = UBound($aLabelCredit_AnimPos) - 1
    $v -= 1
EndFunc ;==>AnimateLabel

Func Min($a, $b)
    If $a < $b Then Return $a
    Return $b
EndFunc ;==>Min

Func Max($a, $b)
    If $a > $b Then Return $a
    Return $b
EndFunc ;==>Max

Func ShowPreview($iCtrl)
    $aPosWin = WinGetPos($hGUI)
    $aPosCtrl = ControlGetPos($hGUI, "", $iCtrl)
    Local $iNewX, $iNewX1 = $aPosWin[0] - $ihGui_PreviewSize + 10, $iNewX2 = $aPosWin[0] + $aPosWin[2] - 10
    $iNewX = $iNewX1
    If $iNewX1 < $aFullScreen[0] Then
        $iNewX = $iNewX2
    EndIf
    WinMove($hGui_Preview, "", $iNewX, $aPosWin[1] + 50)
    GUISetState(@SW_SHOWNOACTIVATE, $hGui_Preview)
EndFunc ;==>ShowPreview

Func _GetImage($sFile, $iWH, $iBkClr = 0xFFFFFF)
    Local $hBmp1, $hBitmap, $hGraphic, $hImage, $iW, $iH, $aGS, $hBmp2, $aFTS
    $aFTS = FileGetTime($sFile)
    If @error Then Return SetError(1, 0, 0)
    $hBmp1 = _WinAPI_CreateBitmap($iWH, $iWH, 1, 32)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp1)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _WinAPI_DeleteObject($hBmp1)
    _GDIPlus_GraphicsClear($hGraphic, BitOR(0xFF000000, $iBkClr))
    $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    GUICtrlSetData($idLabel_Info, StringRegExpReplace($sFile, ".*\\(.*)", "$1") & @LF & Round(FileGetSize($sFile) / 1024, 0) & " kb (" & $iW & " x " & $iH & ")" & @LF & $aFTS[0] & "/" & $aFTS[1] & "/" & $aFTS[2] & " " & $aFTS[3] & ":" & $aFTS[4] & ":" & $aFTS[5] & @LF & "Alpha: " & $bIsAlpha & ", Gray: " & $bIsGray)
    $aGS = _GetScale($iW, $iH, $iWH)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, $aGS[0], $aGS[1], $aGS[2], $aGS[3])
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    $hBmp2 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Return $hBmp2
EndFunc ;==>_GetImage

Func _GetScale($iW, $iH, $iWH)
    Local $aRet[4]
    If $iW <= $iWH And $iH <= $iWH Then
        $aRet[2] = $iW
        $aRet[3] = $iH
        $aRet[0] = ($iWH - $aRet[2]) / 2
        $aRet[1] = ($iWH - $aRet[3]) / 2
    ElseIf $iW > $iH Then
        $aRet[2] = $iWH
        $aRet[3] = $iH / ($iW / $iWH)
        $aRet[0] = 0
        $aRet[1] = ($iWH - $aRet[3]) / 2
    ElseIf $iW < $iH Then
        $aRet[2] = $iW / ($iH / $iWH)
        $aRet[3] = $iWH
        $aRet[0] = ($iWH - $aRet[2]) / 2
        $aRet[1] = 0
    ElseIf $iW = $iH Then
        $aRet[2] = $iWH
        $aRet[3] = $iWH
        $aRet[0] = 0
        $aRet[1] = 0
    EndIf
    Return $aRet
EndFunc ;==>_GetScale

Func _hBmpToPicControl($iCID, ByRef $hBmp, $iFlag = 0)
    Local $hOldBmp
    $hOldBmp = GUICtrlSendMsg($iCID, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
    If $hOldBmp Then _WinAPI_DeleteObject($hOldBmp)
    If $iFlag Then _WinAPI_DeleteObject($hBmp)
EndFunc ;==>_hBmpToPicControl

Func _GDIPlus_CreateHistogram($sRounding = "Ceiling")
    Local $iMaxL, $iMaxC, $iMaxR, $iMaxG, $iMaxB, $a, $r, $g, $b, $yR, $yG, $yB
    For $i = 1 + $bIsAlpha To 256
        If $bIsAlpha Then
;~          ConsoleWrite("Alpha: " & DllStructGetData($tStructChannel0, "channel0", $i) & @CRLF)
            $r = DllStructGetData($tStructChannel1, "channel1", $i)
            $yR = $r * $frY
            If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxR Then $iMaxR = $r

            $g = DllStructGetData($tStructChannel2, "channel2", $i)
            $yG = $g * $fgY
            If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxG Then $iMaxG = $g

            $b = DllStructGetData($tStructChannel3, "channel3", $i)
            $yB = $b * $fbY
            If DllStructGetData($tStructChannel3 , "channel3", $i) > $iMaxB Then $iMaxB = $b

            $fAverage_cRGB += $r + $g + $b
            $fAverage_L += $yR + $yG + $yB
        Else
            $r = DllStructGetData($tStructChannel0, "channel0", $i)
            $yR = $r * $frY
            If DllStructGetData($tStructChannel0 , "channel0", $i) > $iMaxR Then $iMaxR = $r

            $g = DllStructGetData($tStructChannel1, "channel1", $i)
            $yG = $g * $fgY
            If DllStructGetData($tStructChannel1 , "channel1", $i) > $iMaxG Then $iMaxG = $g

            $b = DllStructGetData($tStructChannel2, "channel2", $i)
            $yB = $b * $fbY
            If DllStructGetData($tStructChannel2 , "channel2", $i) > $iMaxB Then $iMaxB = $b
        EndIf

        $fAverage_cRGB += $r + $g + $b
        $fAverage_L += $yR + $yG + $yB

        $aLuminosity[$i] = $yR + $yG + $yB
        If $aLuminosity[$i] > $iMaxL Then $iMaxL = $aLuminosity[$i]

        $aCRGB[$i] = ($r + $g + $b) / 3
        If $aCRGB[$i] > $iMaxC Then $iMaxC = $aCRGB[$i]
    Next
    $fAverage_cRGB /= 256 * 3
    $fAverage_L /= 256

    _GDIPlus_GraphicsClear($hCtxt_HL, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HC, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HR, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HG, 0xFFFFFFFF)
    _GDIPlus_GraphicsClear($hCtxt_HB, 0xFFFFFFFF)

    Local $iDL = 1, $iDC = 1, $iDR = 1, $iDG = 1, $iDB = 1
    Local $sRoundings = "Round,Ceiling,Floor,"
    If Not StringInStr($sRoundings, $sRounding) Then $sRounding = "Ceiling"
    If $iMaxL > 128 Then
;~      $iDL = Ceiling($iMaxL / 128)
        $iDL = Execute($sRounding & "(" & $iMaxL / 128 & ")")
    Else
        $iDL = 1 / (128 / $iMaxL)
    EndIf
    If $iMaxC > 128 Then
;~      $iDC = Ceiling($iMaxC / 128)
        $iDC = Execute($sRounding & "(" & $iMaxC / 128 & ")")
    Else
        $iDC = 1 / (128 / $iMaxC)
    EndIf
    If $iMaxR > 128 Then
;~      $iDR = Ceiling($iMaxR / 128)
        $iDR = Execute($sRounding & "(" & $iMaxR / 128 & ")")
    Else
        $iDR = 1 / (128 / $iMaxR)
    EndIf
    If $iMaxG > 128 Then
;~      $iDG = Ceiling($iMaxG / 128)
        $iDG = Execute($sRounding & "(" & $iMaxG / 128 & ")")
    Else
        $iDG = 1 / (128 / $iMaxG)
    EndIf
    If $iMaxB > 128 Then
;~      $iDB = Ceiling($iMaxB / 128)
        $iDB = Execute($sRounding & "(" & $iMaxB / 128 & ")")
    Else
        $iDB = 1 / (128 / $iMaxB)
    EndIf
    For $i = 1 To 256
        _GDIPlus_PenSetColor($hPen_H, 0xFF000000)
        _GDIPlus_GraphicsDrawLine($hCtxt_HL, $i - 1, 127, $i - 1, 127 - (Int($aLuminosity[$i] / $iDL)), $hPen_H)
        _GDIPlus_PenSetColor($hPen_H, 0xFF000000)
        _GDIPlus_GraphicsDrawLine($hCtxt_HC, $i - 1, 127, $i - 1, 127 - (Int($aCRGB[$i] / $iDC)), $hPen_H)
        _GDIPlus_PenSetColor($hPen_H, 0xFFB00000)
        If $bIsAlpha Then
            _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDR)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF00B000)
            _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDG)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0)
            _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel3, "channel3", $i) / $iDB)), $hPen_H)
        Else
            _GDIPlus_GraphicsDrawLine($hCtxt_HR, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel0, "channel0", $i) / $iDR)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF00B000)
            _GDIPlus_GraphicsDrawLine($hCtxt_HG, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel1, "channel1", $i) / $iDG)), $hPen_H)
            _GDIPlus_PenSetColor($hPen_H, 0xFF0000B0)
            _GDIPlus_GraphicsDrawLine($hCtxt_HB, $i - 1, 127, $i - 1, 127 - (Int(DllStructGetData($tStructChannel2, "channel2", $i) / $iDB)), $hPen_H)
        EndIf
    Next

EndFunc ;==>_GDIPlus_CreateHistogram

Func _GDIPlus_CreateColorGradient($sColorChannel, $iW, $iH, $bHBitmap = True)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($aResult[6])
;~  _GDIPlus_GraphicsSetSmoothingMode($hCtxt, 2)
    Local $hPen = _GDIPlus_PenCreate()
    DllCall($ghGDIPDll, "uint", "GdipSetPenLineJoin", "handle", $hPen, "int", $iLineJoinBevel)
    Local $i, $c
    For $i = 0 To $iW
        $c = Hex($i, 2)
        Switch $sColorChannel
            Case "L"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c)
            Case "C"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & $c & $c)
            Case "R"
                _GDIPlus_PenSetColor($hPen, "0xFF" & $c & "0000")
            Case "G"
                _GDIPlus_PenSetColor($hPen, "0xFF00" & $c & "00")
            Case "B"
                _GDIPlus_PenSetColor($hPen, "0xFF0000" & $c)
        EndSwitch
        _GDIPlus_GraphicsDrawLine($hCtxt, $i, 0, $i, $iH, $hPen)
    Next
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_PenDispose($hPen)
    If $bHBitmap Then
        Local $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($aResult[6])
        _GDIPlus_BitmapDispose($aResult[6])
        Return $hHBmp
    EndIf
    Return $aResult[6]
EndFunc ;==>_GDIPlus_CreateColorGradient

;http://msdn.microsoft.com/en-us/library/windows/desktop/ms536307(v=vs.85).aspx
Func _GDIPlus_BitmapGetHistogram($hBitmap, $iFormat, $iGetHistogramSize, $pStructChannel0, $pStructChannel1, $pStructChannel2, $pStructChannel3 = 0)
    Local $aRes = DllCall($ghGDIPDll, "bool", "GdipBitmapGetHistogram", "handle", $hBitmap, "uint", $iFormat, "uint", $iGetHistogramSize, "struct*", $pStructChannel0, "struct*", $pStructChannel1, "struct*", $pStructChannel2, "struct*", $pStructChannel3)
    If @error Then Return SetError(1, @error, 0)
    Return 1
EndFunc ;==>_GDIPlus_BitmapGetHistogram

;http://msdn.microsoft.com/en-us/library/windows/desktop/ms536308(v=vs.85).aspx
Func _GDIPlus_BitmapGetHistogramSize($iFormat)
    Local $aRes = DllCall($ghGDIPDll, "int", "GdipBitmapGetHistogramSize", "uint", $iFormat, "dword*", 0)
    If @error Then Return SetError(1, @error, 0)
    Return $aRes[2]
EndFunc ;==>_GDIPlus_BitmapGetHistogramSize

Func _GDIPlus11_Startup() ;code by Authenticity - modified by UEZ
    Local $pInput, $tInput, $pToken, $tToken, $aResult, $os

    $giGDIPRef += 1
    If $giGDIPRef > 1 Then Return True

    Switch @OSVersion
        Case "WIN_VISTA", "WIN_2008"
            $ghGDIPDll = DllOpen(@WindowsDir & "\winsxs\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.6000.16386_none_8df21b8362744ace\gdiplus.dll")
        Case "WIN_2008R2", "WIN_7", "WIN_8"
            $ghGDIPDll = DllOpen(@SystemDir & "\gdiplus.dll")
        Case Else
            Return SetError(1)
    EndSwitch
;~ _WinAPI_Check("_GDIPlus_Startup (GDIPlus.dll not found)", @error, False)

    $tInput = DllStructCreate($tagGDIPSTARTUPINPUT)
    $pInput = DllStructGetPtr($tInput)
    $tToken = DllStructCreate("int Data")
    $pToken = DllStructGetPtr($tToken)
    DllStructSetData($tInput, "Version", 1)
    $aResult = DllCall($ghGDIPDll, "int", "GdiplusStartup", "ptr", $pToken, "ptr", $pInput, "ptr", 0)
    If @error Then Return SetError(@error, @extended, False)
    $giGDIPToken = DllStructGetData($tToken, "Data")
    Return $aResult[0] = 0
EndFunc ;==>_GDIPlus11_Startup

Download: GDI+ Show Histogram.au3 (80 downloads previously)

GdipBitmapGetHistogram(), GdipBitmapGetHistogramSize() and 2 more GDI+ functions requires GDI+ v1.1 which means this will only run on Vista or higher operating systems.

I hope the values are correct especially the value for luminosity.

Br,

UEZ

There is no explanation in this topic UEZ :P

صرح السماء كان هنا

 

Share this post


Link to post
Share on other sites

:shocked:

Is this not enough?

Here a little tool to display the histogram of an image...

Br,

UEZ ;)


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
Quote

Change that to $__g_hGDIPDll 

I don't like bringing up old threads, but I just saw a topic—from 2010—that addressed this same problem.

Well, I made the above changes to this very worthwhile histogram utility ... and it runs ... but the histogram area is always blank. (The file, itself, reads and displays.)

Has anyone updated this to produce a working result?

Thanks for any help.

 

Share this post


Link to post
Share on other sites

Try the updated version from 2015 -> see post#1. It still runs with current and beta version properly (3.3.14.5 / 3.3.15.1).

 


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

UEZ, thanks for your quick response. It now runs (after I removed the wrapper statements) but the histogram doesn't seem right for the page I'm testing. Everything seems skewed to the right.

Any ideas for what to look for?

Histogram.PNG.a741f6d05e98f375d9b4ba6d7ac4aae2.PNG

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  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Gowrisankar
      Dear members of the forum,
      I'm working on a project in which I have to use Image recognition technique. 
      Due to client restrictions, I couldn't use AutoIt for this project. 
      Is there a way to use this DLL "ImageSearchDLL.dll" (which is used to do image recognition steps in AutoIt) in VB.Net to achieve the same result? 
      I have used this DLL few years before and got good results. If there is a latest version of this DLL and if you can share it, that will be helpful too.
      Any guidance is deeply appreciated.
    • By UEZ
      This project has been discontinued!
       
      Here a small tool I wrote to update my Sysinternal tools collection without the need to download always the whole package or visiting the site to check for updates. I know that there are several tools available (also some tools written in AutoIt) but here another one for the collection. It was good exercise for me to code it.
       
       
        
       
       
      Some files from the live web site cannot be downloaded although they are visible!
       
      Here the download link of the source code only: AutoIt Sysinternal Tools Synchronizer v0.99.6 build 2020-09-23 beta.7z  (1557 downloads previously)
      -=> Requires AutoIt version 3.3.13.20 or higher / tested on Win8.1 real machine and some VMs: Win7 / Vista / Win10
       
      Compiled exe only: @MediaFire
       
      Just select the Sysinternal Tools folder or create one and press the synchronize button to download the selected items. Click on AutoIt label (near to left upper corner) to open menu.
       
      Special thanks to LarsJ, Melba23 and mesale0077 for their help. 
       
      I've still some ideas to implement which are more gimmick related, so it is not finished yet...
      If you want to add your language please check out #Region Language. Thanks. 
       
      Please report any bug or if you have any suggestions.
       
      The language of the tool tip from each of the executable in the left list view were automatically created using Google translator and weren't checked for correctness.
       
      Br,
      UEZ
    • By UEZ
      Here another example to mark the desktop to get the marked region for capturing. This example is not perfect and not very fast (room for improvements).
      ;Coded by UEZ build 2020-08-07 beta ;Code cleanup up mLipok ; ;Short instruction: mark area on your desktop and press return key to capture. #include <APISysConstants.au3> #include <Array.au3> ;#include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <WinAPIGdi.au3> #include <WinAPISysWin.au3> #include <WindowsConstants.au3> ; enum _PROCESS_DPI_AWARENESS -> https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx Global Enum $DPI_AWARENESS_INVALID = -1, $PROCESS_DPI_UNAWARE = 0, $PROCESS_SYSTEM_DPI_AWARE, $PROCESS_PER_MONITOR_DPI_AWARE ;https://docs.microsoft.com/en-us/windows/desktop/hidpi/dpi-awareness-context Global Enum $Context_UnawareGdiScaled = -5, $Context_PerMonitorAwareV2, $Context_PerMonitorAware, $Context_SystemAware, $Context_Unaware _WinAPI_SetProcessDpiAwarenessContext($Context_PerMonitorAware) Global $__g_hGUI_MarkArea, $__g_hGUI_Bg, $__g_iLabel_TL, $__g_iLabel_TM, $__g_iLabel_TR, $__g_iLabel_LM, $__g_iLabel_RM, $__g_iLabel_BL, $__g_iLabel_BM, _ $__g_iLabel_BR, $__g_iOldCursor, $__g_iW, $__g_iH, $__g_iColor_ResizeDots = 0xFFFFFF, $__g_iBorder = 4, $__g_bSelectionDone = False Global $aRect = _GDIPlus_MarkScreenRegionAnimated() Global $hImage_Capture = _ScreenCapture_Capture(@TempDir & "\Test.png", $aRect[0], $aRect[1], $aRect[0] + $aRect[2] - 1, $aRect[1] + $aRect[3] - 1, False) ShellExecute(@TempDir & "\Test.png") ;_ArrayDisplay($aRect, "Marked area coordinates") Func _GDIPlus_MarkScreenRegionAnimated($bAnim = True) _GDIPlus_Startup() Local Const $hFullScreen = WinGetHandle("[TITLE:Program Manager;CLASS:Progman]") Local Const $aFullScreen = WinGetPos($hFullScreen) $__g_hGUI_Bg = GUICreate("", $aFullScreen[2], $aFullScreen[3], $aFullScreen[0], $aFullScreen[1], BitOR($WS_CLIPCHILDREN, $WS_POPUP), $WS_EX_TOPMOST) ;to avoid cursor flickering and for proper control read WinSetTrans($__g_hGUI_Bg, "", 0x01) $__g_hGUI_MarkArea = GUICreate("", 1, 1, -1, -1, $bAnim ? $WS_POPUP : BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED), $__g_hGUI_Bg) GUISetBkColor(0xABCDEF, $__g_hGUI_MarkArea) If Not $bAnim Then $__g_iColor_ResizeDots = 0xFF0000 $__g_iLabel_TL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_TR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;top right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_LM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;left mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_RM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;right mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BL = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom left GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BM = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom mid GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) $__g_iLabel_BR = GUICtrlCreateLabel("", 0, 0, $__g_iBorder, $__g_iBorder) ;bottom right GUICtrlSetResizing(-1, $GUI_DOCKSIZE) GUICtrlSetBkColor(-1, $__g_iColor_ResizeDots) GUISetState(@SW_SHOWNA, $__g_hGUI_Bg) GUISetState(@SW_SHOW, $__g_hGUI_MarkArea) $__g_iOldCursor = MouseGetCursor() GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) _WinAPI_SetLayeredWindowAttributes($__g_hGUI_MarkArea, 0xABCDEF, 0xF0) Local $aMPos, $aPrevMPos[2] = [MouseGetPos(0) + 1, MouseGetPos(1) + 1], $iID, $aCI, $iX, $iY, $aOldWinPos, $aOldMPos, $bMoved Local $aGUIStartPos, $iKey_Exit = GUICtrlCreateButton("", $aFullScreen[0] - 10, $aFullScreen[1] - 10, 1, 1), $aAccelKeys[1][2] = [["{ENTER}", $iKey_Exit]] GUISetAccelerators($aAccelKeys, $__g_hGUI_Bg) GUISetAccelerators($aAccelKeys, $__g_hGUI_MarkArea) #forceref $bMoved Do Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $iKey_Exit If $bAnim Then GUIRegisterMsg($WM_TIMER, "") DllCall("user32.dll", "bool", "KillTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", $iID) GUIRegisterMsg($WM_ERASEBKGND, "") EndIf _GDIPlus_Shutdown() Local $aResult = WinGetPos($__g_hGUI_MarkArea) $aResult[2] = WinGetClientSize($__g_hGUI_MarkArea)[0] $aResult[3] = WinGetClientSize($__g_hGUI_MarkArea)[1] GUIDelete($__g_hGUI_MarkArea) GUIDelete($__g_hGUI_Bg) If Not $__g_bSelectionDone Then $aResult = 0 Return $aResult EndSwitch $aMPos = MouseGetPos() If ($aMPos[0] <> $aPrevMPos[0] Or $aMPos[1] <> $aPrevMPos[1]) And (Not $__g_bSelectionDone) Then WinMove($__g_hGUI_MarkArea, "", $aMPos[0], $aMPos[1]) $aPrevMPos = $aMPos EndIf $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If $aCI[2] And (Not $__g_bSelectionDone) Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $bAnim Then GUIRegisterMsg($WM_ERASEBKGND, "WM_ERASEBKGND") GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") $iID = DllCall("User32.dll", "uint_ptr", "SetTimer", "hwnd", $__g_hGUI_MarkArea, "uint_ptr", 1, "uint", 50, "ptr", 0)[0] EndIf While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) $aMPos = MouseGetPos() $__g_iW = Abs($aMPos[0] - $aGUIStartPos[0]) + 1 $__g_iH = Abs($aMPos[1] - $aGUIStartPos[1]) + 1 If $aMPos[0] < $aGUIStartPos[0] Then $iX = $aMPos[0] Else $iX = $aGUIStartPos[0] EndIf If $aMPos[1] < $aGUIStartPos[1] Then $iY = $aMPos[1] Else $iY = $aGUIStartPos[1] EndIf WinMove($__g_hGUI_MarkArea, "", $iX, $iY, $__g_iW, $__g_iH) UpdateCtrlPos($bAnim) WEnd $__g_bSelectionDone = True GUISetCursor(3, 1, $__g_hGUI_MarkArea) ElseIf $aCI[3] And $__g_bSelectionDone Then $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If _WinAPI_PtInRectEx(MouseGetPos(0), MouseGetPos(1), $aGUIStartPos[0], $aGUIStartPos[1], $aGUIStartPos[0] + $aGUIStartPos[2], $aGUIStartPos[1] + $aGUIStartPos[3]) Then $aMPos = MouseGetPos() $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) While $aCI[3] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aGUIStartPos[0] - ($aMPos[0] - MouseGetPos(0)), $aGUIStartPos[1] - ($aMPos[1] - MouseGetPos(1)), $__g_iW, $__g_iH) GUISetCursor(0, 1, $__g_hGUI_Bg) GUISetCursor(0, 1, $__g_hGUI_MarkArea) WEnd GUISetCursor(3, 1, $__g_hGUI_Bg) GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndIf EndIf If $__g_bSelectionDone Then $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) If @error Then ContinueLoop Switch $aCI[4] Case $__g_iLabel_TL GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), MouseGetPos(1), $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BR GUISetCursor(12, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TR GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BL GUISetCursor(10, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_LM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", MouseGetPos(0), $aOldWinPos[1], $aOldWinPos[2] + ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_RM GUISetCursor(13, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2] - ($aOldMPos[0] - MouseGetPos(0)), $aOldWinPos[3]) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_TM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], MouseGetPos(1), $aOldWinPos[2], $aOldWinPos[3] + ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case $__g_iLabel_BM GUISetCursor(11, 1, $__g_hGUI_MarkArea) If $aCI[2] Then $aOldWinPos = WinGetPos($__g_hGUI_MarkArea) $aOldMPos = MouseGetPos() While $aCI[2] * Sleep(10) $aCI = GUIGetCursorInfo($__g_hGUI_MarkArea) WinMove($__g_hGUI_MarkArea, "", $aOldWinPos[0], $aOldWinPos[1], $aOldWinPos[2], $aOldWinPos[3] - ($aOldMPos[1] - MouseGetPos(1))) WEnd UpdateCtrlPos($bAnim) EndIf Case Else GUISetCursor(3, 1, $__g_hGUI_MarkArea) EndSwitch EndIf Until False EndFunc ;==>_GDIPlus_MarkScreenRegionAnimated Func UpdateCtrlPos($bAnim = True) Local Const $aGUIStartPos = WinGetPos($__g_hGUI_MarkArea) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "") $__g_iW = $aGUIStartPos[2] $__g_iH = $aGUIStartPos[3] ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TL, 0, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TM, ($__g_iW - $__g_iBorder) / 2, 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_TR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), 0, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_LM, 0, ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_RM, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder) / 2, $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BL, 0, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BM, ($__g_iW - $__g_iBorder) / 2, ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) ControlMove($__g_hGUI_MarkArea, "", $__g_iLabel_BR, ($__g_iW - $__g_iBorder - $__g_iBorder / 2), ($__g_iH - $__g_iBorder - $__g_iBorder / 2), $__g_iBorder, $__g_iBorder) If $__g_bSelectionDone And $bAnim Then GUIRegisterMsg($WM_TIMER, "PlayBorderAnim") EndFunc ;==>UpdateCtrlPos Func PlayBorderAnim() Local $aWinPos = WinGetClientSize($__g_hGUI_MarkArea), $iW = $aWinPos[0], $iH = $aWinPos[1] Local Static $fOffset = 0 Local Const $iSize = $__g_iBorder / 2 Local Const $hDC = _WinAPI_GetDC($__g_hGUI_MarkArea) Local Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH) Local Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC) Local Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap) Local Const $hCanvas = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer) Local Const $hPen = _GDIPlus_PenCreate(0xFF0178D7, $iSize), $hPen2 = _GDIPlus_PenCreate(0xFFFFFFFF, $iSize), _ $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $__g_iColor_ResizeDots), $hPen3 = _GDIPlus_PenCreate(0xFF000000) _GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDASHDOT) _GDIPlus_GraphicsClear($hCanvas, 0xFFABCDEF) ;for faster performance direct dll calls DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen2, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipSetPenDashOffset", "handle", $hPen, "float", $fOffset) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen, "float", 1 + $iSize, "float", 1 + $iSize, "float", $iW - 2 * $iSize - 2, "float", $iH - 2 * $iSize - 2) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", 0, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) / 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", 0, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) / 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipFillRectangle", "handle", $hCanvas, "handle", $hBrush, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) DllCall($__g_hGDIPDll, "int", "GdipDrawRectangle", "handle", $hCanvas, "handle", $hPen3, "float", ($iW - $__g_iBorder) - 2, "float", ($iH - $__g_iBorder) - 2, "float", $__g_iBorder + 1, "float", $__g_iBorder + 1) _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY) $fOffset += 0.5 _GDIPlus_GraphicsDispose($hCanvas) _WinAPI_SelectObject($hDC_backbuffer, $DC_obj) _WinAPI_DeleteDC($hDC_backbuffer) _WinAPI_DeleteObject($hHBitmap) _WinAPI_ReleaseDC($__g_hGUI_MarkArea, $hDC) _GDIPlus_PenDispose($hPen) _GDIPlus_PenDispose($hPen2) _GDIPlus_PenDispose($hPen3) _GDIPlus_BrushDispose($hBrush) EndFunc ;==>PlayBorderAnim Func WM_ERASEBKGND($hWnd, $iMsgm, $wParam, $lParam) ;suppress repainting to avoid flickering but causes some other side effects #forceref $iMsgm, $wParam, $lParam, $hWnd Local Const $hBrush = _WinAPI_CreateSolidBrush(0xEFCDAB) ;BGR format ;~ _WinAPI_RedrawWindow($__g_hGUI_MarkArea, 0, 0, BitOR($RDW_NOERASE, $RDW_NOCHILDREN, $RDW_NOFRAME, $RDW_VALIDATE)) _WinAPI_SetClassLongEx($__g_hGUI_MarkArea, $GCL_HBRBACKGROUND, $hBrush) _WinAPI_DeleteObject($hBrush) Return 0 EndFunc ;==>WM_ERASEBKGND ;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext Func _WinAPI_SetProcessDpiAwarenessContext($DPIAwareContext = $Context_PerMonitorAware, $hGUI = 0, $iMode = 3) ;https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiawarenesscontext $DPIAwareContext = ($DPIAwareContext < -5) ? -5 : ($DPIAwareContext > -1) ? -1 : $DPIAwareContext $iMode = ($iMode < 1) ? 1 : ($iMode > 3) ? 3 : $iMode Switch $iMode Case 1 Local $hDC = _WinAPI_GetDC($hGUI) Local $aResult1 = DllCall("user32.dll", "ptr", "GetDpiFromDpiAwarenessContext", "ptr", $hDC) If @error Or Not IsArray($aResult1) Then Return SetError(11, 0, 0) _WinAPI_ReleaseDC(0, $hDC) Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult1[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(12, 0, 0) Case 2 ;~ If Not $hGUI Then $hGUI = WinGetHandle(AutoItWinGetTitle()) Local $aResult2 = DllCall("user32.dll", "int", "GetWindowDpiAwarenessContext", "ptr", $hGUI) If @error Or Not IsArray($aResult2) Then Return SetError(21, 0, 0) Local $aResult = DllCall("user32.dll", "Bool", "SetProcessDpiAwarenessContext", "int", $aResult2[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(22, 0, 0) Case 3 Local $aResult31 = DllCall("user32.dll", "ptr", "GetThreadDpiAwarenessContext") If @error Or Not IsArray($aResult31) Then Return SetError(31, 0, 0) Local $aResult32 = DllCall("user32.dll", "ptr", "GetAwarenessFromDpiAwarenessContext", "ptr", $aResult31[0]) If @error Or Not IsArray($aResult32) Then Return SetError(32, 0, 0) Local $aResult = DllCall("user32.dll", "Bool", "SetThreadDpiAwarenessContext", "int", $aResult32[0] + $DPIAwareContext) If @error Or Not IsArray($aResult) Then Return SetError(33, 0, 0) EndSwitch Return 1 EndFunc ;==>_WinAPI_SetProcessDpiAwarenessContext  
      Just press the lmb and move your mouse. When lmb is released you can adjust the size of the window by dragging the white rectangle to any direction. Rmb will move the marked area.
      Press ESC to get the coordinates of the marked region.
      If you have any improvements, please post it here.
       
      Tested on Win10 x64 only.
       
    • By amosrinat
      Hi,
      i have an AutoIT script that sends emails with two embedded images.
      When users get the email they don't see the images. How should I fix my code?
      Thank you for your support,
      Amos
      Func fSendMail() $TemplateName = StringRegExpReplace($Template, "^.*\\|\..*$", "") $SmtpServer = "smtp.**.com" $FromName = "do-not-reply@*********" $FromAddress = "do-not-reply@******" $ToAddress = $MG1_Mgr & ";"& $Owner $Subject = "ACTION REQUIRED - " & $TemplateName $Body = $sBody5 $IPPort = 25 $ssl = 0 Global $oMyRet[2] Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc") $rc = fINetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $IPPort, $ssl) If @error Then MyErrFunc() EndIf EndFunc;fSendMail Func fINetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $IPPort = 25, $ssl = 0) Local $objEmail = ObjCreate("CDO.Message") $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress Local $i_Error = 0 Local $i_Error_desciption = "" $objEmail.Subject = $s_Subject If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then $objEmail.HTMLBody = $as_Body Else $objEmail.Textbody = $as_Body & @CRLF EndIf $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer If Number($IPPort) = 0 Then $IPPort = 25 $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort $objEmail.Configuration.Fields.Update $objEmail.Fields.Update ;$objEmail.Send **************** If @error Then MyErrFunc() EndIf $objEmail = "" EndFunc;fINetSmtpMailCom  
    • By coronatuss
      Hello everyone,
      Im developing an script to check the size of all .jpg stored in windows folder.
      The problem is that it doesn´t work properly with rotated images. 
      With _GDIPlus_ImageGetWidth() and _GDIPlus_ImageGetHeight()  I get the Width and Height of images as if they had not been rotated, and I need to know how they are rotated (orientation and grades).
      Any help is welcome! If more info is needed, please tell. 😁
×
×
  • Create New...