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 Bilgus
      This is an update or derivative work of Beege 's Scrolling Line Graph UDF
      https://www.autoitscript.com/forum/topic/109599-scrolling-line-graph-udf
       
      I noticed a few issues for my use case with the UDF one being that adding a sample required updating the waveform
      High CPU usage went hand in hand with that requirement
      Another issue was just how long updating took to complete
      I've hopefully rectified that with this version
       
      There are a few changes (only 1 line per graph for instance)
      The addition of a function AddSample (uses graphics paths to speed up drawing samples on update) Gridlines are only generated once A sample finished line can be added UpdateGraph allows you to compress the discarded portion of the graph (it looks kinda cool but uses more CPU) Lower Cpu usage Uses real Control Ids - it is a label control underneath so you get click events and can display text when control is disabled Example (Waveform.au3)
       
      Example 2 (peak.au3)
      UDF
      Updated:
      Previous Downloads [38 / 38/ 0]
      SSLG.au3 waveform.au3 Peak.au3
    • By nacerbaaziz
      hello autoit team
      please i've a question for you.
      am creating a audio player
      and in this audio player i want to show the current trac info
      such as the total time and the position ... etc
      i know i can show it as label
      but the screen reader for the blind read the text every change
      because it have a screen scan
      what i want is to show this informations but such image or icon
      i mean i need to create
      GUICtrlCreatepic or GUICtrlCreateicon ....
      or some thing as that
      and show this informations as image on it
      i think that i can do that with the 
      _GDIPlus functions
      but i couldn't find the currect way to do it
      i tried the _GDIPlus_GraphicsDrawString
      but i couldn't know how it work
      what i need is a small example that create a GUI
      and add a multy line text to it as graphic or image.
      so i need a simple way because it will changed every sec
      i hope any one can help me to do that
      global $GUI = GUICreate("text", 400, 400) global $label = GUICtrlCreateLabel(GetText(), 10, 10, 380, 380) GUISetState() do sleep(100) until GUIGetMSG() = -3 exit func GetText() return StringFormat("file name is test.mp3 \r\n total time is 00:30:00 \r\n position is 00:05:50") endFunc  
    • By UEZ
      I was inspired by a CSS example to create a procedural graphic without any shader or ray tracing technique.
      Here the result using GDI+ only:

       
      Blue Orb.au3
      ;Inspired from https://codepen.io/bradleytaunt/details/VwvzKyb ;Coded by UEZ build 2020-05-07 #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> If @OSBuild < 7600 Then Exit MsgBox(BitOR($MB_TOPMOST, $MB_ICONERROR), "ERROR", "This demo requires GDIPlus v1.1", 10) _GDIPlus_Startup() Global Const $iW = 1200, $iH = 700, $iSize_globe = 450 Global Const $hGUI = GUICreate("GDI+ Procedural Gfx / Blue Orb v1.20 by UEZ", $iW, $iH, -1, -1, $WS_POPUP, $WS_EX_TOPMOST) Global Const $hCanvas = _GDIPlus_GraphicsCreateFromHWND($hGUI) Global Const $hImage = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Global Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hImage) _GDIPlus_GraphicsSetSmoothingMode($hGfx, $GDIP_SMOOTHINGMODE_ANTIALIAS8X8) ;~ _GDIPlus_GraphicsSetCompositingQuality($hGfx, $GDIP_COMPOSITINGQUALITYHIGHQUALITY) _GDIPlus_GraphicsSetInterpolationMode($hGfx, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, $GDIP_PIXELOFFSETMODE_HALF) ;draw background Global Const $hBrush_bg = _GDIPlus_LineBrushCreate($iW / 2, 0, $iW / 2, $iH / 2, 0xFF1E88E5, 0xFF1565C0, 2) _GDIPlus_LineBrushSetSigmaBlend ($hBrush_bg, 0.95, 1) ;create blurry edge _GDIPlus_GraphicsFillRect($hGfx, 0, 0, $iW, $iH, $hBrush_bg) ;draw blurred text Global Const $hImage_text = _GDIPlus_BitmapCreateFromScan0($iW, $iH / 2) Global Const $hGfx_text = _GDIPlus_ImageGetGraphicsContext($hImage_text) Global Const $hPath_text = _GDIPlus_PathCreate() Global Const $hFamily = _GDIPlus_FontFamilyCreate("Impact") Global Const $hStringFormat = _GDIPlus_StringFormatCreate() Global Const $hBrush_txt = _GDIPlus_LineBrushCreate($iW / 2, 0, $iW / 2, $iH / 2, 0xE0FFFFFF, 0xA01A237E) ;_GDIPlus_BrushCreateSolid(0xF02E86FB) _GDIPlus_LineBrushSetSigmaBlend($hBrush_txt, 0.66, 1) Global Const $hPen_txt = _GDIPlus_PenCreate(0x801A237E, 1) _GDIPlus_StringFormatSetAlign($hStringFormat, 1) _GDIPlus_StringFormatSetLineAlign($hStringFormat, 1) _GDIPlus_GraphicsSetSmoothingMode($hGfx_text, $GDIP_SMOOTHINGMODE_ANTIALIAS8X8) _GDIPlus_GraphicsSetTextRenderingHint($hGfx_text, $GDIP_TextRenderingHintAntialias) _GDIPlus_GraphicsSetPixelOffsetMode($hGfx_text, $GDIP_PIXELOFFSETMODE_HALF) _GDIPlus_GraphicsSetCompositingQuality($hGfx_text, $GDIP_COMPOSITINGQUALITYHIGHQUALITY) Global $tLayout = _GDIPlus_RectFCreate() $tLayout.width = $iW $tLayout.height = $iH / 2 $tLayout.y = -$iH * 0.05 _GDIPlus_PathAddString($hPath_text, "AutoIt rulez!", $tLayout, $hFamily, 0, $iW / 8, $hStringFormat) _GDIPlus_GraphicsFillPath($hGfx_text, $hPath_text, $hBrush_txt) _GDIPlus_GraphicsDrawPath($hGfx_text, $hPath_text, $hPen_txt) Global Const $hEffect_blur_text = _GDIPlus_EffectCreateBlur(20) _GDIPlus_BitmapApplyEffect($hImage_text, $hEffect_blur_text) _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage_text, 0, 0, $iW, $iH / 2) ;draw shadow of the text Global Const $hBrush_txt_shadow = _GDIPlus_BrushCreateSolid(0x40000000) _GDIPlus_GraphicsClear($hGfx_text, 0) _GDIPlus_PathReset($hPath_text) $tLayout.width = $iW $tLayout.height = $iH / 2 $tLayout.y = 0 _GDIPlus_PathAddString($hPath_text, "AutoIt rulez!", $tLayout, $hFamily, 0, $iW / 8, $hStringFormat) _GDIPlus_GraphicsFillPath($hGfx_text, $hPath_text, $hBrush_txt_shadow) Global Const $hEffect_blur_text_shadow = _GDIPlus_EffectCreateBlur(60) _GDIPlus_BitmapApplyEffect($hImage_text, $hEffect_blur_text_shadow) _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage_text, 0, $iH * 0.55, $iW, $iH / 8) ;draw shadow Global Const $iW_shadow1 = $iSize_globe * 0.85, $iH_shadow1 = $iSize_globe * 0.1, $iW_shadow2 = $iSize_globe * 0.60, _ $iW_shadow_Img = $iW_shadow1 * 2, $iH_shadowImg = $iH_shadow1 * 4 Global Const $hImage_shadow = _GDIPlus_BitmapCreateFromScan0($iW_shadow_Img, $iH_shadowImg) Global Const $hGfx_shadow = _GDIPlus_ImageGetGraphicsContext($hImage_shadow) _GDIPlus_GraphicsSetSmoothingMode($hGfx_shadow, $GDIP_SMOOTHINGMODE_ANTIALIAS8X8) Global Const $hBrush_shadow = _GDIPlus_BrushCreateSolid(0x66000000) _GDIPlus_GraphicsFillEllipse($hGfx_shadow, ($iW_shadow_Img - $iW_shadow1) / 2, ($iH_shadowImg / 4 + $iH_shadow1), $iW_shadow1, $iH_shadow1, $hBrush_shadow) _GDIPlus_BrushSetSolidColor($hBrush_shadow, 0xB3000000) _GDIPlus_GraphicsFillEllipse($hGfx_shadow, ($iW_shadow_Img - $iW_shadow2) / 2, ($iH_shadowImg / 4 + $iH_shadow1), $iW_shadow2, $iH_shadow1, $hBrush_shadow) Global Const $hEffect_blur_shadow = _GDIPlus_EffectCreateBlur(32) _GDIPlus_BitmapApplyEffect($hImage_shadow, $hEffect_blur_shadow) _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage_shadow, ($iW - $iW_shadow_Img) / 2, $iH / 2 + $iH_shadow1 * 2.20, $iW_shadow_Img, $iH_shadowImg) ;draw globe Global Const $hPath_globe = _GDIPlus_PathCreate() _GDIPlus_PathAddEllipse($hPath_globe, ($iW - $iSize_globe) / 2, ($iH - $iSize_globe) / 2, $iSize_globe, $iSize_globe) Global Const $hLBrush_globe1 = _GDIPlus_LineBrushCreate($iW / 2, ($iH - $iSize_globe) / 2, $iW / 2, ($iH + $iSize_globe) / 2, 0, 0, 1) Global $aInterpolations[5][2] $aInterpolations[0][0] = 4 $aInterpolations[1][0] = 0xFFFFFFFF $aInterpolations[1][1] = 0 $aInterpolations[2][0] = 0xFFEEEEEE $aInterpolations[2][1] = 0.10 $aInterpolations[3][0] = 0xFF2E86FB $aInterpolations[3][1] = 0.50 $aInterpolations[4][0] = 0xFF1A237E $aInterpolations[4][1] = 1.0 _GDIPlus_LineBrushSetPresetBlend($hLBrush_globe1, $aInterpolations) _GDIPlus_GraphicsFillPath($hGfx, $hPath_globe, $hLBrush_globe1) Global Const $iSize_globe2 = $iSize_globe * 0.85, $iSize_globe2_Img = $iSize_globe2 * 1.5 Global Const $hImage_globe2 = _GDIPlus_BitmapCreateFromScan0($iSize_globe2_Img, $iSize_globe2_Img) Global Const $hGfx_globe2 = _GDIPlus_ImageGetGraphicsContext($hImage_globe2) Global Const $hBrush_globe2 = _GDIPlus_BrushCreateSolid(0x7F000000) ;draw shadow and blur it Global Const $px = ($iSize_globe2_Img - $iSize_globe2) / 2, $py = ($iSize_globe2_Img - $iSize_globe2) / 2 _GDIPlus_GraphicsFillEllipse($hGfx_globe2, $px, $py + ($iSize_globe - $iSize_globe2) * 0.25, $iSize_globe2, $iSize_globe2, $hBrush_globe2) Global Const $hEffect_blur_shadow2 = _GDIPlus_EffectCreateBlur(15) _GDIPlus_BitmapApplyEffect($hImage_globe2, $hEffect_blur_shadow2) ;draw 2nd smaller globe and blur it, too Global Const $hLBrush_globe2 = _GDIPlus_LineBrushCreate($iW / 2, $py, $iW / 2, $py + $iSize_globe2, 0, 0) Dim $aInterpolations[4][2] $aInterpolations[0][0] = 3 $aInterpolations[1][0] = 0xFFFFFFFF $aInterpolations[1][1] = 0 $aInterpolations[2][0] = 0xFF2E86FB $aInterpolations[2][1] = 0.60 $aInterpolations[3][0] = 0xFF283593 $aInterpolations[3][1] = 1.0 _GDIPlus_LineBrushSetPresetBlend($hLBrush_globe2, $aInterpolations) _GDIPlus_GraphicsFillEllipse($hGfx_globe2, $px, $py, $iSize_globe2, $iSize_globe2, $hLBrush_globe2) Global Const $hImage_globe2_blur = _Blur($hImage_globe2, $iSize_globe, $iSize_globe) ;windows gdi+ blur doesn't work properly _GDIPlus_GraphicsDrawImageRect($hGfx, $hImage_globe2_blur, ($iW - $iSize_globe2_Img) / 2 - ($iSize_globe - $iSize_globe2) / 8, ($iH - $iSize_globe2_Img) / 2, $iSize_globe2_Img, $iSize_globe2_Img) GUISetState() _GDIPlus_GraphicsDrawImageRect($hCanvas, $hImage, 0, 0, $iW, $iH) ;~ _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Blue Orb v1.20.png") ;clean-up ressources _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hStringFormat) _GDIPlus_EffectDispose($hEffect_blur_text) _GDIPlus_EffectDispose($hEffect_blur_text_shadow) _GDIPlus_EffectDispose($hEffect_blur_shadow) _GDIPlus_EffectDispose($hEffect_blur_shadow2) _GDIPlus_PathDispose($hPath_text) _GDIPlus_PathDispose($hPath_globe) _GDIPlus_PenDispose($hPen_txt) _GDIPlus_BrushDispose($hBrush_txt) _GDIPlus_BrushDispose($hBrush_txt_shadow) _GDIPlus_BrushDispose($hBrush_bg) _GDIPlus_BrushDispose($hLBrush_globe1) _GDIPlus_BrushDispose($hLBrush_globe2) _GDIPlus_BrushDispose($hBrush_globe2) _GDIPlus_ImageDispose($hImage) _GDIPlus_ImageDispose($hImage_text) _GDIPlus_ImageDispose($hImage_shadow) _GDIPlus_ImageDispose($hImage_globe2) _GDIPlus_ImageDispose($hImage_globe2_blur) _GDIPlus_GraphicsDispose($hCanvas) _GDIPlus_GraphicsDispose($hGfx_text) _GDIPlus_GraphicsDispose($hGfx_shadow) _GDIPlus_GraphicsDispose($hGfx_globe2) _GDIPlus_Shutdown() Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete($hGUI) Exit Func _Blur($hBitmap, $iW, $iH, $fScale = 0.0525, $dx1 = 0, $dy1 = 0, $dx2 = 0, $dy2 = 0, $qual = 6) ; by eukalyptus Local $hBmpSmall = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Local $hGfxSmall = _GDIPlus_ImageGetGraphicsContext($hBmpSmall) _GDIPlus_GraphicsSetPixelOffsetMode($hGfxSmall, $GDIP_PIXELOFFSETMODE_HALF) Local $hBmpBig = _GDIPlus_BitmapCreateFromScan0($iW, $iH) Local $hGfxBig = _GDIPlus_ImageGetGraphicsContext($hBmpBig) _GDIPlus_GraphicsSetPixelOffsetMode($hGfxBig, $GDIP_PIXELOFFSETMODE_HALF) _GDIPlus_GraphicsScaleTransform($hGfxSmall, $fScale, $fScale) _GDIPlus_GraphicsSetInterpolationMode($hGfxSmall, $qual) _GDIPlus_GraphicsScaleTransform($hGfxBig, 1 / $fScale, 1 / $fScale) _GDIPlus_GraphicsSetInterpolationMode($hGfxBig, $qual) _GDIPlus_GraphicsDrawImageRect($hGfxSmall, $hBitmap, 0, $dx1, $iW, $iH + $dy1) _GDIPlus_GraphicsDrawImageRect($hGfxBig, $hBmpSmall, 0, $dx2, $iW, $iH + $dy2) _GDIPlus_BitmapDispose($hBmpSmall) _GDIPlus_GraphicsDispose($hGfxSmall) _GDIPlus_GraphicsDispose($hGfxBig) Return $hBmpBig EndFunc ;==>_Blur  
      I hope you like it.
       
      Feel free to post your examples here, too. 
    • By therks
      So I don't have any code cooked up yet as this is still in the theoretical stage. Just looking for some advice.
      My current idea is to resize the image to 1x1 pixel, probably using _GDIPlus_ImageResize, and read the color of the resulting pixel to obtain an admittedly very general sense of brightness. Does anyone think this could work?
      We have a CCTV system running at home using some home made cameras (raspberry pi) and we're trying to automate toggling settings for day/night time. We started with an AutoIt script that checked sunrise and sundown times for our location (calculations pulled from here) and toggled the settings based on that. Unfortunately our weather varies wildly, so it can get light/dark far outside normal sunrise/sundown times. Now we're hoping to periodically grab a still from the camera and toggle the light mode based on that.
×
×
  • Create New...