Jump to content
Sign in to follow this  
InunoTaishou

More _Color UDFs

Recommended Posts

After spending 15 minutes last night trying to get the RGB from an ARGB color I had remembered BitXOR. After figuring that one out I set forth a clean way to increase and decrease an individual color component in a color (without having to do something like Hex(_ColorGetRed(0xFF0000) - 10, 2). I don't really know a lot about Bit operations so it was interesting to see how it works and finally figured it out when I was looking closely at how the Color UDF got the Red, green, and blue components from a color.

; #Functions# ===================================================================================================================
; _ColorRGB             - Return the RGB color of the individual components.
; _ColorARGB            - Return the ARGB color of the individual components.
; _ColorGetAlpha        - Returns the alpha value of the color. 0 - 255
; _ColorAdjustAlpha     - Adjust (increase or decrease) the alpha component of a color.
; _ColorAdjustRed       - Adjust (increase or decrease) the red component of a color.
; _ColorAdjustGreen     - Adjust (increase or decrease) the green component of a color.
; _ColorAdjustBlue      - Adjust (increase or decrease) the blue component of a color.
; ===============================================================================================================================

Func _ColorRGB($iR, $iG, $iB, Const $_iCurrentExtended = @extended)
    Return SetExtended($_iCurrentExtended, BitOR(BitShift($iR, -16), BitShift($iG, -8), $iB))
EndFunc   ;==>_ColorRGB

Func _ColorARGB($iA, $iR, $iG, $iB, Const $_iCurrentExtended = @extended)
    Return SetExtended($_iCurrentExtended, BitOR(BitShift($iA, -24), BitShift($iR, -16), BitShift($iG, -8), $iB))
EndFunc   ;==>_ColorARGB

Func _ColorGetAlpha($iColor, Const $_iCurrentExtended = @extended)
    If (Not BitAND($iColor, 0xFF000000)) Then Return SetError(1, 0, 0)
    Return SetExtended($_iCurrentExtended, BitAND(BitShift($iColor, 24), 0xFF))
EndFunc   ;==>_ColorGetAlpha

Func _ColorAdjustAlpha($iColor, $iAmount, Const $_iCurrentExtended = @extended)
    If (Not BitAND($iColor, 0xFF000000) And $iAmount < 0) Then Return SetError(1, 0, $iColor)
    Local $iA = BitAND(BitShift($iColor, 24), 0xFF)
    If ($iAmount < 0 And $iA + $iAmount < 0) Then $iAmount = -$iA
    If ($iAmount > 0 And $iA = 255) Then Return $iColor
    If ($iAmount > 0 And $iA + $iAmount > 255) Then $iAmount = Abs($iA - $iAmount)
    Return SetExtended($_iCurrentExtended, $iColor + BitShift($iAmount, -24))
EndFunc   ;==>_ColorAdjustAlpha

Func _ColorAdjustRed($iColor, $iAmount, Const $_iCurrentExtended = @extended)
    If (Not BitAND($iColor, 0xFF0000) And $iAmount < 0) Then Return SetError(1, 0, $iColor)
    Local $iR = BitAND(BitShift($iColor, 16), 0xFF)
    If ($iAmount < 0 And $iR + $iAmount < 0) Then $iAmount = -$iR
    If ($iAmount > 0 And $iR = 255) Then Return $iColor
    If ($iAmount > 0 And $iR + $iAmount > 255) Then $iAmount = Abs($iR - $iAmount)
    Return SetExtended($_iCurrentExtended, $iColor + BitShift($iAmount, -16))
EndFunc   ;==>_ColorAdjustRed

Func _ColorAdjustGreen($iColor, $iAmount, Const $_iCurrentExtended = @extended)
    If (Not BitAND($iColor, 0xFF00) And $iAmount < 0) Then Return SetError(1, 0, $iColor)
    Local $iG = BitAND(BitShift($iColor, 8), 0xFF)
    If ($iAmount < 0 And $iG + $iAmount < 0) Then $iAmount = -$iG
    If ($iAmount > 0 And $iG = 255) Then Return $iColor
    If ($iAmount > 0 And $iG + $iAmount > 255) Then $iAmount = Abs($iG - $iAmount)
    Return SetExtended($_iCurrentExtended, $iColor + BitShift($iAmount, -8))
EndFunc   ;==>_ColorAdjustGreen

Func _ColorAdjustBlue($iColor, $iAmount, Const $_iCurrentExtended = @extended)
    If (Not BitAND($iColor, 0xFF) And $iAmount < 0) Then Return SetError(1, 0, $iColor)
    Local $iB = BitAND($iColor, 0xFF)
    If ($iAmount < 0 And $iB + $iAmount < 0) Then $iAmount = -$iB
    If ($iAmount > 0 And $iB = 255) Then Return $iColor
    If ($iAmount > 0 And $iB + $iAmount > 255) Then $iAmount = Abs($iB - $iAmount)
    Return SetExtended($_iCurrentExtended, $iColor + $iAmount)
EndFunc   ;==>_ColorAdjustBlue

A quick example using them.

Global $iBaseRGB = 0x00FFFF
Global $iBaseARGB = 0xC8000000
Global $iBaseAlpha = _ColorGetAlpha($iBaseARGB)
Global $iRemoveG = _ColorAdjustGreen($iBaseRGB, -255)
Global $iRemoveGB = _ColorAdjustBlue($iRemoveG, -255)
Global $iRemoveGBAddR = _ColorAdjustRed($iRemoveGB, 255)
Global $iRemoveGBAddRA = _ColorAdjustAlpha($iRemoveGBAddR, $iBaseAlpha)

MsgBox("", "Adjusting colors", "Base RGB color: 0x" & Hex($iBaseRGB, 6) & @CRLF & _
        "Remove Green component: 0x" & Hex($iRemoveG, 6) & @CRLF & _
        "Remove Blue component: 0x" & Hex($iRemoveGB, 6) & @CRLF & _
        "Add Red component: 0x" & Hex($iRemoveGBAddR, 6) & @CRLF & @CRLF & _
        "Base ARGB color: 0x" & Hex($iBaseARGB, 8) & @CRLF & _
        "Alpha for $iBaseAlpha: 0x" & Hex($iBaseAlpha, 2) & @CRLF & _
        "Add $iBaseAlpha to $iRemoveGBAddR: 0x" & Hex($iRemoveGBAddRA, 8) & @CRLF & _
        "Max Alpha for $iRemoveGBAddRA: 0x" & Hex(_ColorAdjustAlpha($iRemoveGBAddRA, 255)) & @CRLF & @CRLF & _
        "RGB for Red 31, Green 31, Blue 31: 0x" & Hex(_ColorRGB(31, 31, 31), 6) & @CRLF & _
        "ARGB for Alpha 255, Red 42, Green 42, and Blue 42: 0x" & Hex(_ColorARGB(255, 42, 42, 42), 8))

All my bit operations and math should be right, I tested each function. No need to calculate how much you need to add, or subtract, to a component to max, or 0, it. Just use the max value (255 or -255).

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  

  • Similar Content

    • By argumentum
      ..I'm coding the High Contrast theme editor and using the _ChooseColor() I wandered why it does not keep the the custom colors I've added.
      Found that adding a static declaration would do it. But why stop there. Why not keep going, So I put this together that is non code braking ( backwards compatible ), to replace the one in <Misc.au3>
      _ChooseColor_mod_Example() Func _ChooseColor_mod_Example() Local $aCustColors[17] $aCustColors[1] = 0xFF0000 $aCustColors[16] = 0x0000FF $aCustColors = _ChooseColor_mod(2, "0x00ff00", 2, 0, $aCustColors) ConsoleWrite(@CRLF & $aCustColors[0] & @CRLF & @CRLF) ConsoleWrite(@CRLF & _ChooseColor_mod(2, $aCustColors[0], 2, 0, $aCustColors)[0] & @CRLF & @CRLF) ConsoleWrite(@CRLF & _ChooseColor_mod(2, "0x00ff00", 2) & @CRLF & @CRLF) ; just as default behaviour ConsoleWrite(@CRLF & _ChooseColor_mod(2, "0x00ff00", 2, 0, 'reset as is neither "Default" nor "Array[17]"') & @CRLF & @CRLF) ; just as default behaviour EndFunc ;==>_ChooseColor_mod_Example ; #FUNCTION# ==================================================================================================================== ; Name ..........: _ChooseColor_mod ; Description ...: ; Syntax ........: _ChooseColor_mod([$iReturnType = 0[, $iColorRef = 0[, $iRefType = 0[, $hWndOwnder = 0[, $vCustColors = Default]]]]]) ; Parameters ....: $iReturnType - [optional] an integer value. Default is 0. See remarks for values. ; $iColorRef - [optional] an integer value. Default is 0. ; $iRefType - [optional] an integer value. Default is 0. See remarks for values. ; $hWndOwnder - [optional] a handle to the parent window. Default is 0. ; $vCustColors - [optional] an array of colors to show as custom values. See remarks for values. ; Return values .: Success - Hex value of the selected color ; Failure - $vCustomColors is returned if set, otherwise, -1 is returned. Also sets @error: ; | -2 - User initialized $tagCustcolors via $vCustColors. ; | -3 - User canceled or invalid dll struct. ; | -4 - Invalid $iReturnType value. ; | Other - Error returned from Dll call. ; Author ........: Gary Frost (gafrost) ; Modified ......: argumentum ; Remarks .......: $iReturnType can be 0 (RGB COLORREF), 1 (Hex BGR), or 2 (Hex RGB). ; $iRefType can be 0 (ColorRef), 1 (BGR Hex), or 2 (RGB Hex). ; $vCustColors is a zero based array[17] where: ; index 0 hold the color returned by the function. ; index 1 to 16 are the colors to use in Custom colors in RGB. ; One can pass the array with array[0] = -2 to initialize the custom colors without loading the interface. ; When $vCustColors is used, it returns the modified array. ( not the color as integer ). ; Anything other than Default or a proper array, will clear $tagCustcolors ( holder of the custom colors ). ; When $vCustColors is omited or Default, $tagCustcolors is kept ( hence, no need for the array to keep custom colors ). ; Related .......: Same Func from <Misc.au3> ; Link ..........: https://www.autoitscript.com/forum/topic/200985-_choosecolor-but-better/ ; Example .......: YES ; =============================================================================================================================== Func _ChooseColor_mod($iReturnType = 0, $iColorRef = 0, $iRefType = 0, $hWndOwnder = 0, $vCustColors = Default) ; basic code from Misc.au3 ; https://www.autoitscript.com/forum/topic/200985-_choosecolor-but-better/ ; added here for independance of #include <Misc.au3> Local Static $tagCHOOSECOLOR = "dword Size;hwnd hWndOwnder;handle hInstance;dword rgbResult;ptr CustColors;dword Flags;lparam lCustData;" & _ "ptr lpfnHook;ptr lpTemplateName" Local Static $__MISCCONSTANT_CC_ANYCOLOR = 0x0100 Local Static $__MISCCONSTANT_CC_FULLOPEN = 0x0002 Local Static $__MISCCONSTANT_CC_RGBINIT = 0x0001 ; added here for independance of #include <Misc.au3> Local $vReturn, $bCustColors = False, $tagCustcolors = "dword[16]" Local $tChoose = DllStructCreate($tagCHOOSECOLOR) Local Static $tCc = DllStructCreate($tagCustcolors) ; added Static (mod.), to keep $tagCustcolors changes by user when called again. If $vCustColors == Default Then ; nothing ElseIf UBound($vCustColors) = 17 Then $bCustColors = True For $n = 1 To 16 DllStructSetData($tCc, 1, $vCustColors[$n], $n) Next Else $tCc = DllStructCreate($tagCustcolors) ; reset, just in case you'd want to have it default again EndIf If $iRefType = 1 Then ; BGR hex color to colorref $iColorRef = Int($iColorRef) ElseIf $iRefType = 2 Then ; RGB hex color to colorref $iColorRef = Hex(String($iColorRef), 6) $iColorRef = '0x' & StringMid($iColorRef, 5, 2) & StringMid($iColorRef, 3, 2) & StringMid($iColorRef, 1, 2) EndIf DllStructSetData($tChoose, "Size", DllStructGetSize($tChoose)) DllStructSetData($tChoose, "hWndOwnder", $hWndOwnder) DllStructSetData($tChoose, "rgbResult", $iColorRef) DllStructSetData($tChoose, "CustColors", DllStructGetPtr($tCc)) DllStructSetData($tChoose, "Flags", BitOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT)) Local $aResult = DllCall("comdlg32.dll", "bool", "ChooseColor", "struct*", $tChoose) If @error Then If Not $bCustColors Then Return SetError(@error, @extended, -1) Else $vCustColors[0] = -1 Return SetError(@error, @extended, $vCustColors) EndIf EndIf If $bCustColors Then ; this here is better than at the end, For $n = 1 To 16 ; that way you'll get the custom colors anyway. $vCustColors[$n] = DllStructGetData($tCc, 1, $n) Next If $vCustColors[0] = -2 Then Return $vCustColors EndIf If $aResult[0] = 0 Then ; Return SetError(-3, -3, -1) ; user selected cancel or struct settings incorrect If Not $bCustColors Then Return SetError(-3, -3, -1) Else $vCustColors[0] = -1 Return SetError(-3, -3, $vCustColors) EndIf EndIf Local $sColor_picked = DllStructGetData($tChoose, "rgbResult") If $iReturnType = 1 Then ; return Hex BGR Color $vReturn = '0x' & Hex(String($sColor_picked), 6) ElseIf $iReturnType = 2 Then ; return Hex RGB Color $sColor_picked = Hex(String($sColor_picked), 6) $vReturn = '0x' & StringMid($sColor_picked, 5, 2) & StringMid($sColor_picked, 3, 2) & StringMid($sColor_picked, 1, 2) ElseIf $iReturnType = 0 Then ; return RGB COLORREF $vReturn = $sColor_picked Else $vReturn = -1 SetError(-4, -4) EndIf If Not $bCustColors Then Return $vReturn $vCustColors[0] = $vReturn Return $vCustColors EndFunc ;==>_ChooseColor_mod Hopefully will replace the default one in the next release 
    • By DannyJ
      Hello Forum, 
      I have one special Combo-box [with BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE) ] and if I press one button I want to change the Combo-box's background color, and after I press Button B I want to change it to the basic settings and it not works.
      I wanna do this with one combo-box.
      I have already tried several methods and I tried  GUICtrlComboSetColors that I have found on this forum.
      (But this methods works perfectly with Cobo boxes that don't have BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE). 
      Here is the example code
      #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= ;$CBS_DROPDOWNLIST ;$GUI_SS_DEFAULT_COMBO $Form1 = GUICreate("Form1", 504, 249, 252, 227) $Combo1 = GUICtrlCreateCombo("", 136, 24, 193, 25,BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE)) ; I want to change this special combo's background color if I press button 1 $Button1 = GUICtrlCreateButton("Button1", 112, 96, 75, 25) $Button2 = GUICtrlCreateButton("Button2", 264, 96, 75, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### GUICtrlSetData($Combo1," " & "|" & "apple" & "|" & "banana" & "|" & "cherry" ," ") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 GUICtrlSetBkColor($Combo1,0x0078D7) Case $Button2 ;Makes the original bc color GUICtrlSetBkColor($Combo1,0xFFFFFF) EndSwitch WEnd  
      Thanks you in advance your help
    • By user4157124
      ConsoleWrite('>Message here.' & @CRLF) outputs colored text (per + > - ! characters).
      ConsoleWrite('warning' & @TAB & '38' & @TAB & 'more text ...' & @CRLF) enables jump to line 38 on doubleclick.

      Using "jump to line" format, only red and pink text coloring seems possible (simply prefixing color directives to output-text disables jump to line functionality). Is it possible to combine the two (define custom color while keeping "jump to line" functionality)?
    • By Miliardsto
      I have the following code. You can see there are $color_normal and $color_trans
      In my case normal is too dark . And color trans is to much violet.
      If you run it you will see how its looks. I want gui with listView have the same color like taskbar in windows 10.
      How to achieve that?
       
       
      #include <Date.au3> #include <MsgBoxConstants.au3> #include <GuiListBox.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> HotKeySet("{ESC}", "Terminate") $color_normal = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) $color_trans = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) $trans = RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") ConsoleWrite("Transpart = " & $trans & @CRLF) ConsoleWrite("Color normal = " & $color_normal & @CRLF) ConsoleWrite("Color trans = " & $color_trans & @CRLF) ConsoleWrite(_Get_taskbar_color()); It return AARRGGBB $taskbarColor = _Get_taskbar_color() Global $gui = GUICreate("Test", 150, 58,@DesktopWidth-300,@DesktopHeight-58,$WS_POPUP,BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) Global $idListview = GUICtrlCreateListView("", 0, 0, 150, 58,BitOR($LBS_NOTIFY,$LBS_SORT), 0) ;_GuiCtrlMakeTrans(-1,100) ; Add column _GUICtrlListView_AddColumn($idListview, "Msgs", 100) GUICtrlSetFont(-1, 7, 400, 0, "Segoe UI") GUICtrlSetColor(-1, 0x470C4F) GUICtrlSetBkColor($idListview, 0x310638) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func Terminate() Exit EndFunc Func _Get_taskbar_color() If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "ColorPrevalence") Then If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) Else Return "0xFF" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) EndIf Else If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9000000" Else Return "0xFF000000" EndIf EndIf EndFunc  
    • By dejhost
      Happy New Year everyone!
      I would like to extract the color values of certain pixels in an image.  This is how I picture the workflow: 
      User opens an image of his choice. Image is shown on the screen. User draws a line into the image. This happens by marking the startpixel and the endpixel of the line The line is drawn, so the user can check visually if he is happy with the line.  The following pixel based properties belonging to the line are stored in Excel: X-Coordinate Y-Coordinate Color Value Additional operations: Extracting for max- and min. color values; Statistical operations.   Browsing through the helpfile of AutoIt I find plenty of functions for treating images (e.g. GDIPlus), but I am completely unsure if Autoit will get me there. Should I read the entire image into an array? Should I rather attempt to script an external image software (e.g. IrfanView, Gimp)?
      I would be very thankful if someone could give some recommendations and maybe list a couple of the most important commands to use.
      Thank you very much.
      Dejhost
       
       
×
×
  • Create New...