seadoggie01 Posted November 23, 2019 Posted November 23, 2019 Derp. Thanks @Nine. I was failing. I passed a hex to Dec and it needed to be a string. I see now. I should be able to convert the function then 🙄 All my code provided is Public Domain... but it may not work. Use it, change it, break it, whatever you want. Spoiler My Humble Contributions:Personal Function Documentation - A personal HelpFile for your functionsAcro.au3 UDF - Automating Acrobat ProToDo Finder - Find #ToDo: lines in your scriptsUI-SimpleWrappers UDF - Use UI Automation more Simply-erKeePass UDF - Automate KeePass, a password managerInputBoxes - Simple Input boxes for various variable types
argumentum Posted November 23, 2019 Author Posted November 23, 2019 12 minutes ago, seadoggie01 said: Can you convert hex to integers? #include <Array.au3> _ArrayDisplay(CalcRGBAvg(20, 50, 100, 0, 0, 0)) _ArrayDisplay(CalcRGBAvg(0, 0, 255, 255, 0, 0)) Func CalcRGBAvg($iRed, $iGreen, $iBlue, $iRed2, $iGreen2, $iBlue2, $iMidPoints = 9) ; Add one to midpoints... don't know why :D $iMidPoints += 1 Local $aColors[0] Local $iRedDiff = Abs($iRed - $iRed2) Local $bRedRev = ($iRedDiff = $iRed - $iRed2) Local $iGreenDiff = Abs($iGreen - $iGreen2) Local $bGreenRev = ($iGreenDiff = $iGreen - $iGreen2) Local $iBlueDiff = Abs($iBlue - $iBlue2) Local $bBlueRev = ($iBlueDiff = $iBlue - $iBlue2) For $i = 0 To $iMidPoints ;~ _ArrayAdd($aColors, "RGB(" & _ ;~ Abs(($bRedRev ? 0 : -255) + $iRedDiff/$iMidPoints * $i) & ", " & _ ;~ Abs(($bGreenRev ? 0 : -255) + $iGreenDiff/$iMidPoints * $i) & ", " & _ ;~ Abs(($bBlueRev ? 0 : -255) + $iBlueDiff/$iMidPoints * $i) & ")") _ArrayAdd($aColors, "0x" & _ Hex(Int(Abs(($bRedRev ? 0 : -255) + $iRedDiff / $iMidPoints * $i)), 2) & _ Hex(Int(Abs(($bGreenRev ? 0 : -255) + $iGreenDiff / $iMidPoints * $i)), 2) & _ Hex(Int(Abs(($bBlueRev ? 0 : -255) + $iBlueDiff / $iMidPoints * $i)), 2)) Next Return $aColors EndFunc ;==>CalcRGBAvg Thanks seadoggie01 1 Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
seadoggie01 Posted November 23, 2019 Posted November 23, 2019 Oh. That's way easier. I was trying to bit shift, rotate, and string mid... was going nowhere fast. That's a much better solution argumentum 1 All my code provided is Public Domain... but it may not work. Use it, change it, break it, whatever you want. Spoiler My Humble Contributions:Personal Function Documentation - A personal HelpFile for your functionsAcro.au3 UDF - Automating Acrobat ProToDo Finder - Find #ToDo: lines in your scriptsUI-SimpleWrappers UDF - Use UI Automation more Simply-erKeePass UDF - Automate KeePass, a password managerInputBoxes - Simple Input boxes for various variable types
argumentum Posted November 23, 2019 Author Posted November 23, 2019 (edited) @seadoggie01, looked good but it does not do it right for all combinations: expandcollapse popup#include <Misc.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> CalcRGBAvg_Example() Func CalcRGBAvg_Example() Local $aColors, $n, $nMsg, $aLabels[11] Local $Form1 = GUICreate(Chr(160) & "CalcRGBAvg Example", 615, 436, 192, 114) Local $Button1 = GUICtrlCreateButton("Blend", 128, 24, 75, 25) Local $Color1 = GUICtrlCreateLabel("0xFF7979", 16, 8, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color1, GUICtrlRead($Color1)) GUICtrlSetColor($Color1, _CalcContrastColor(GUICtrlRead($Color1))) GUICtrlSetTip($Color1, "Click to seleect color") Local $Color2 = GUICtrlCreateLabel("0x9D0000", 17, 41, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color2, GUICtrlRead($Color2)) GUICtrlSetColor($Color2, _CalcContrastColor(GUICtrlRead($Color2))) For $n = 0 To 10 $aLabels[$n] = GUICtrlCreateLabel("Label" & $n, 18, 81 + (25 * $n), 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE)) Next GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete() Exit Case $Color1 $n = _ChooseColor(2, GUICtrlRead($Color1), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color1, $n) GUICtrlSetData($Color1, "0x" & Hex($n, 6)) GUICtrlSetColor($Color1, _CalcContrastColor(GUICtrlRead($Color1))) Case $Color2 $n = _ChooseColor(2, GUICtrlRead($Color2), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color2, $n) GUICtrlSetData($Color2, "0x" & Hex($n, 6)) GUICtrlSetColor($Color2, _CalcContrastColor(GUICtrlRead($Color2))) Case $Button1 $aColors = CalcRGBAvg(GUICtrlRead($Color1), GUICtrlRead($Color2)) For $n = 0 To UBound($aColors) -1 GUICtrlSetBkColor($aLabels[$n], $aColors[$n]) GUICtrlSetData($aLabels[$n], "0x" & Hex($aColors[$n], 6)) GUICtrlSetColor($aLabels[$n], _CalcContrastColor($aColors[$n])) Next EndSwitch WEnd EndFunc ;==>CalcRGBAvg_Example Func CalcRGBAvg($iBaseColor1, $iBaseColor2, $iMidPoints = 11) $iRed2 = BitAND(BitShift($iBaseColor1, 16), 0xFF) $iGreen2 = BitAND(BitShift($iBaseColor1, 8), 0xFF) $iBlue2 = BitAND($iBaseColor1, 0xFF) $iRed = BitAND(BitShift($iBaseColor2, 16), 0xFF) $iGreen = BitAND(BitShift($iBaseColor2, 8), 0xFF) $iBlue = BitAND($iBaseColor2, 0xFF) Local $aColors[$iMidPoints] $iMidPoints -= 1 Local $iRedDiff = Abs($iRed - $iRed2) Local $bRedRev = ($iRedDiff = $iRed - $iRed2) Local $iGreenDiff = Abs($iGreen - $iGreen2) Local $bGreenRev = ($iGreenDiff = $iGreen - $iGreen2) Local $iBlueDiff = Abs($iBlue - $iBlue2) Local $bBlueRev = ($iBlueDiff = $iBlue - $iBlue2) For $i = 0 To $iMidPoints $aColors[$i] = "0x" & _ Hex(Ceiling(Abs(($bRedRev ? 0 : -255) + $iRedDiff / $iMidPoints * $i)), 2) & _ Hex(Ceiling(Abs(($bGreenRev ? 0 : -255) + $iGreenDiff / $iMidPoints * $i)), 2) & _ Hex(Ceiling(Abs(($bBlueRev ? 0 : -255) + $iBlueDiff / $iMidPoints * $i)), 2) Next Return $aColors EndFunc ;==>CalcRGBAvg Func _CalcContrastColor($crBg) ; https://www.autoitscript.com/forum/topic/97345-contrast-color/?do=findComment&comment=700911 ; http://www.codeproject.com/KB/tips/JbColorContrast.aspx Local Const $TOLERANCE = 30 If (Abs(BitAND($crBg , 0xFF) - 0x80) <= $TOLERANCE And _ Abs(BitAND(BitShift($crBg , 8) , 0xFF) - 0x80) <= $TOLERANCE And _ Abs(BitAND(BitShift($crBg , 16), 0xFF) - 0x80) <= $TOLERANCE) _ Then Return BitAND((0x7F7F7F + $crBg) , 0xFFFFFF); Return BitXOR($crBg ,0xFFFFFF); EndFunc Red and blue was good so I thought that was it but, no dice ( my screen colors are tweaked with high contrast. That's why the GUI looks like that ) Edited November 23, 2019 by argumentum Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
seadoggie01 Posted November 23, 2019 Posted November 23, 2019 I still can't get the hex colors to work, but I got my old function fixed ; Gets the difference in two colors, and multiplies the first color by a percent of the difference to get the averages Func CalcRGBAvg($iRed, $iGreen, $iBlue, $iRed2, $iGreen2, $iBlue2, $iMidPoints = 9) $iMidPoints += 1 Local $aColors[0] Local $iRedDiff = $iRed - $iRed2 If $iRed > $iRed2 Then $iRedDiff *= -1 Local $iGreenDiff = $iGreen - $iGreen2 If $iGreen > $iGreen2 Then $iGreenDiff *= -1 Local $iBlueDiff = $iBlue - $iBlue2 If $iBlue > $iBlue2 Then $iBlueDiff *= -1 For $i = 0 To $iMidPoints _ArrayAdd($aColors, "RGB(" & _ $iRed + $iRedDiff/$iMidPoints * $i & ", " & _ $iGreen + $iGreenDiff/$iMidPoints * $i & ", " & _ $iBlue + $iBlueDiff/$iMidPoints * $i & ")") Next Return $aColors EndFunc ;==>CalcRGBAvg TLDR: I forgot to add the original color's value in before, so it was just a percent of the difference All my code provided is Public Domain... but it may not work. Use it, change it, break it, whatever you want. Spoiler My Humble Contributions:Personal Function Documentation - A personal HelpFile for your functionsAcro.au3 UDF - Automating Acrobat ProToDo Finder - Find #ToDo: lines in your scriptsUI-SimpleWrappers UDF - Use UI Automation more Simply-erKeePass UDF - Automate KeePass, a password managerInputBoxes - Simple Input boxes for various variable types
argumentum Posted November 23, 2019 Author Posted November 23, 2019 11 minutes ago, seadoggie01 said: got my old function fixed Spoiler expandcollapse popup#include <Misc.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> CalcRGBAvg_Example() Func CalcRGBAvg_Example() Local $aColors, $n, $nMsg, $aLabels[11] Local $Form1 = GUICreate(Chr(160) & "CalcRGBAvg Example", 615, 436, 192, 114) Local $Button1 = GUICtrlCreateButton("Blend", 128, 24, 75, 25) Local $Color1 = GUICtrlCreateLabel("0xFF7979", 16, 8, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color1, GUICtrlRead($Color1)) GUICtrlSetColor($Color1, _CalcContrastColor(GUICtrlRead($Color1))) GUICtrlSetTip($Color1, "Click to seleect color") Local $Color2 = GUICtrlCreateLabel("0x9D0000", 17, 41, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color2, GUICtrlRead($Color2)) GUICtrlSetColor($Color2, _CalcContrastColor(GUICtrlRead($Color2))) For $n = 0 To 10 $aLabels[$n] = GUICtrlCreateLabel("Label" & $n, 18, 81 + (25 * $n), 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE)) Next GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete() Exit Case $Color1 $n = _ChooseColor(2, GUICtrlRead($Color1), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color1, $n) GUICtrlSetData($Color1, "0x" & Hex($n, 6)) GUICtrlSetColor($Color1, _CalcContrastColor(GUICtrlRead($Color1))) Case $Color2 $n = _ChooseColor(2, GUICtrlRead($Color2), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color2, $n) GUICtrlSetData($Color2, "0x" & Hex($n, 6)) GUICtrlSetColor($Color2, _CalcContrastColor(GUICtrlRead($Color2))) Case $Button1 $aColors = CalcRGBAvg(GUICtrlRead($Color1), GUICtrlRead($Color2)) For $n = 0 To UBound($aColors) -1 GUICtrlSetBkColor($aLabels[$n], $aColors[$n]) GUICtrlSetData($aLabels[$n], "0x" & Hex($aColors[$n], 6)) GUICtrlSetColor($aLabels[$n], _CalcContrastColor($aColors[$n])) Next EndSwitch WEnd EndFunc ;==>CalcRGBAvg_Example ; Gets the difference in two colors, and multiplies the first color by a percent of the difference to get the averages ;~ Func CalcRGBAvg($iRed, $iGreen, $iBlue, $iRed2, $iGreen2, $iBlue2, $iMidPoints = 9) Func CalcRGBAvg($iBaseColor1, $iBaseColor2, $iMidPoints = 11) ;;; to get each color from hex Local $iRed2 = BitAND(BitShift($iBaseColor1, 16), 0xFF) Local $iGreen2 = BitAND(BitShift($iBaseColor1, 8), 0xFF) Local $iBlue2 = BitAND($iBaseColor1, 0xFF) Local $iRed = BitAND(BitShift($iBaseColor2, 16), 0xFF) Local $iGreen = BitAND(BitShift($iBaseColor2, 8), 0xFF) Local $iBlue = BitAND($iBaseColor2, 0xFF) ;;; to get each color from hex ;;; to fix the extra entry Local $aColors[$iMidPoints] $iMidPoints -= 1 ;;; to fix the extra entry Local $iRedDiff = $iRed - $iRed2 If $iRed > $iRed2 Then $iRedDiff *= -1 Local $iGreenDiff = $iGreen - $iGreen2 If $iGreen > $iGreen2 Then $iGreenDiff *= -1 Local $iBlueDiff = $iBlue - $iBlue2 If $iBlue > $iBlue2 Then $iBlueDiff *= -1 For $i = 0 To $iMidPoints ;~ _ArrayAdd($aColors, "RGB(" & _ ;~ $iRed + $iRedDiff/$iMidPoints * $i & ", " & _ ;~ $iGreen + $iGreenDiff/$iMidPoints * $i & ", " & _ ;~ $iBlue + $iBlueDiff/$iMidPoints * $i & ")") $aColors[$i] = "0x" & _ Hex(Ceiling( $iRed + $iRedDiff/$iMidPoints * $i ), 2) & _ Hex(Ceiling( $iGreen + $iGreenDiff/$iMidPoints * $i ), 2) & _ Hex(Ceiling( $iBlue + $iBlueDiff/$iMidPoints * $i ), 2) Next Return $aColors EndFunc ;==>CalcRGBAvg Func _CalcContrastColor($crBg) ; https://www.autoitscript.com/forum/topic/97345-contrast-color/?do=findComment&comment=700911 ; http://www.codeproject.com/KB/tips/JbColorContrast.aspx Local Const $TOLERANCE = 30 If (Abs(BitAND($crBg , 0xFF) - 0x80) <= $TOLERANCE And _ Abs(BitAND(BitShift($crBg , 8) , 0xFF) - 0x80) <= $TOLERANCE And _ Abs(BitAND(BitShift($crBg , 16), 0xFF) - 0x80) <= $TOLERANCE) _ Then Return BitAND((0x7F7F7F + $crBg) , 0xFFFFFF); Return BitXOR($crBg ,0xFFFFFF); EndFunc still not doing it Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted November 23, 2019 Author Posted November 23, 2019 (edited) the HTML that I posted also fails, in #FFDDDD / #FF3333, so, forget about my finding 😫 Edited November 23, 2019 by argumentum Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted November 23, 2019 Author Posted November 23, 2019 ..found this https://www.autoitscript.com/forum/topic/71625-colour-gradient-algorithm/ and I'll tweak that, ..see if it does what I believe I need. Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted November 23, 2019 Author Posted November 23, 2019 (edited) ok, solved the gradient code: expandcollapse popup#include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <Color.au3> #include <Misc.au3> CalcRGBAvg_Example() Func CalcRGBAvg_Example() Local $aColors, $n, $nMsg, $aLabels[11] Local $Form1 = GUICreate(Chr(160) & "CalcRGBAvg Example", 370, 370, -1, -1) Local $Button1 = GUICtrlCreateButton("Blend", 128, 24, 75, 25) Local $Color1 = GUICtrlCreateLabel("0xFFDDDD", 16, 8, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color1, GUICtrlRead($Color1)) GUICtrlSetColor($Color1, _LabelSetBlackOrWhiteTextColor(GUICtrlRead($Color1))) GUICtrlSetTip($Color1, "Click to seleect color") Local $Color2 = GUICtrlCreateLabel("0xFF3333", 17, 41, 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE), $WS_EX_STATICEDGE) GUICtrlSetBkColor($Color2, GUICtrlRead($Color2)) GUICtrlSetColor($Color2, _LabelSetBlackOrWhiteTextColor(GUICtrlRead($Color2))) For $n = 0 To 10 $aLabels[$n] = GUICtrlCreateLabel("Label" & $n, 18, 81 + (25 * $n), 76, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE)) Next GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE GUIDelete() Exit Case $Color1 $n = _ChooseColor(2, GUICtrlRead($Color1), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color1, $n) GUICtrlSetData($Color1, "0x" & Hex($n, 6)) GUICtrlSetColor($Color1, _LabelSetBlackOrWhiteTextColor(GUICtrlRead($Color1))) Case $Color2 $n = _ChooseColor(2, GUICtrlRead($Color2), 2, $Form1) If $n = -1 Then ContinueLoop GUICtrlSetBkColor($Color2, $n) GUICtrlSetData($Color2, "0x" & Hex($n, 6)) GUICtrlSetColor($Color2, _LabelSetBlackOrWhiteTextColor(GUICtrlRead($Color2))) Case $Button1 $aColors = CalcRGBAvg(GUICtrlRead($Color1), GUICtrlRead($Color2)) For $n = 0 To UBound($aColors) - 1 GUICtrlSetBkColor($aLabels[$n], $aColors[$n]) GUICtrlSetData($aLabels[$n], "0x" & Hex($aColors[$n], 6)) GUICtrlSetColor($aLabels[$n], _LabelSetBlackOrWhiteTextColor($aColors[$n])) Next EndSwitch WEnd EndFunc ;==>CalcRGBAvg_Example Func CalcRGBAvg($Color1 = "0xFF0000", $Color2 = "0xFFFF00", $Step = 11) Local $aColor[$Step] ; based on https://www.autoitscript.com/forum/topic/56365-gradient-color-box-thing/ $Step -= 1 Local $ColorR = _ColorGetRed($Color1) Local $ColorG = _ColorGetGreen($Color1) Local $ColorB = _ColorGetBlue($Color1) Local $StepR = (_ColorGetRed($Color2) - $ColorR) / $Step Local $StepG = (_ColorGetGreen($Color2) - $ColorG) / $Step Local $StepB = (_ColorGetBlue($Color2) - $ColorB) / $Step For $i = 0 To $Step $sColor = "0x" & StringFormat("%02X%02X%02X", $ColorR + $StepR * $i, $ColorG + $StepG * $i, $ColorB + $StepB * $i) $aColor[$i] = $sColor Next Return $aColor EndFunc ;==>CalcRGBAvg Func _ColorGetBrightness($Color) Return Round((299 * BitAND(BitShift($Color, 16), 0xFF) + 587 * BitAND(BitShift($Color, 8), 0xFF) + 114 * BitAND($Color, 0xFF)) / 1000) EndFunc ;==>_ColorGetBrightness Func _LabelSetBlackOrWhiteTextColor($Color) Local $iBrightness1 = _ColorGetBrightness($Color) Local $iBrightness2 = _ColorGetBrightness(0xFFFFFF) Local $iBrightnessDiff1 = Abs($iBrightness1 - $iBrightness2) $iBrightness2 = _ColorGetBrightness(0x000000) Local $iBrightnessDiff2 = Abs($iBrightness1 - $iBrightness2) If $iBrightnessDiff1 >= $iBrightnessDiff2 Then Return 0xFFFFFF ; '0x' & Hex ( 0xFFFFFF, 6 ) Else Return 0x000000 ; '0x' & Hex ( 0x000000, 6 ) EndIf EndFunc ;==>_LabelSetBlackOrWhiteTextColor Edited November 24, 2019 by argumentum Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now