- 按键认证大神
- 728264
- 3501
- 18
- 1898 朵
- 27453 个
- 1717 个
- 82980
- 2011-08-04
|
1#
t
T
发表于 2022-05-22 11:07
|
|只看楼主
我们在进行颜色或文字识别时,经常会遇到颜色过于复杂的情况,那么就需要填写很多颜色才能识别。遇到这种情况就会造成一些麻烦,诸如颜色参数填写太长或插件对颜色个数有限制(大漠插件仅允许最多支持10个颜色),解决的方法就是通过偏色来减少颜色个数。但如果随意填写一个偏色就可能会导致颜色识别过少或过多,造成识别不精准的问题。今天我们就来讲一下如何将多个颜色,计算合并成一个精准的颜色范围,即计算偏色。思路:1、将要计算的16进制颜色字符串拆分为R、G、B并转换为10进制,目的是方便用于计算。2、将拆分出全部的R、G、B统计,统计出最大的R、G、B和最小的R、G、B,对应相加并除以二,计算的出R、G、B中间值,即为颜色范围的10进制基础色。3、将统计出最大的R、G、B或最小的R、G、B与R、G、B中间值对应相减,即可得到颜色范围的10进制偏色。4、将10进制基础色转换为16进制,将10进制偏色转换为16进制,然后将二者连接,即为完整的颜色范围。要点:1、16进制转10进制用"Eval"函数配合"&H"。- Function RGB拆分(RGB_Str)
- RGB拆分 = Array(Eval("&H"&Mid(RGB_Str, 1, 2)), Eval("&H"&Mid(RGB_Str, 3, 2)), Eval("&H"&Mid(RGB_Str, 5, 2)))
- End Function
复制代码 2、R、G、B中间值计算时可能会出现小数点,应当只保留整数部分后,再取RGB中间值与RBG最大或RGB最小值中差值最大的值作为偏色。- Function 取最大差值(Min, Max, Avg)
- Dim 差值1, 差值2
- 差值1 = Abs(Min - Avg)
- 差值2 = Abs(Max - Avg)
- If 差值1 > 差值2 Then
- 取最大差值 = 差值1
- Else
- 取最大差值 = 差值2
- End If
- End Function
复制代码 3、由于R、G、B每种颜色为2位长度,所以在10进制转换为16进制时,若转换后的颜色为1位长度,需要"0"&连接颜色,否则颜色不正确。- Function RGB组合(R, G, B)
- R = Hex(R)
- If Len(R) = 1 Then
- R = "0" & R
- End If
- G = Hex(G)
- If Len(G) = 1 Then
- G = "0" & G
- End If
- B = Hex(B)
- If Len(B) = 1 Then
- B = "0" & B
- End If
- RGB组合 = R & G & B
- End Function
复制代码 完整源码:- Function 计算RGB偏色(颜色组合)
- 颜色组合 = Split(颜色组合, "|")
- Dim i, U_颜色组合
- U_颜色组合 = UBound(颜色组合)
- Dim Min_R, Min_G, Min_B
- Dim Max_R, Max_G, Max_B
- Dim Avg_R, Avg_G, Avg_B
- Dim RGB, R, G, B, D_R, D_G, D_B
- RGB = RGB拆分(颜色组合(0))
- Min_R = RGB(0)
- Min_G = RGB(1)
- Min_B = RGB(2)
- Max_R = RGB(0)
- Max_G = RGB(1)
- Max_B = RGB(2)
- For i = 1 To U_颜色组合
- RGB = RGB拆分(颜色组合(i))
- If RGB(0) < Min_R Then
- Min_R = RGB(0)
- Else
- If RGB(0) > Max_R Then
- Max_R = RGB(0)
- End If
- End If
- If RGB(1) < Min_G Then
- Min_G = RGB(1)
- Else
- If RGB(1) > Max_G Then
- Max_G = RGB(1)
- End If
- End If
- If RGB(2) < Min_B Then
- Min_B = RGB(2)
- Else
- If RGB(2) > Max_B Then
- Max_B = RGB(2)
- End If
- End If
- Next
- Avg_R = Int((Min_R + Max_R) / 2)
- Avg_G = Int((Min_G + Max_G) / 2)
- Avg_B = Int((Min_B + Max_B) / 2)
- D_R = 取最大差值(Min_R, Max_R, Avg_R)
- D_G = 取最大差值(Min_G, Max_G, Avg_G)
- D_B = 取最大差值(Min_B, Max_B, Avg_B)
- 计算RGB偏色 = RGB组合(Avg_R, Avg_G, Avg_B) &"-"& RGB组合(D_R, D_G, D_B)
- End Function
- Function RGB拆分(RGB_Str)
- RGB拆分 = Array(Eval("&H"&Mid(RGB_Str, 1, 2)), Eval("&H"&Mid(RGB_Str, 3, 2)), Eval("&H"&Mid(RGB_Str, 5, 2)))
- End Function
- Function RGB组合(R, G, B)
- R = Hex(R)
- If Len(R) = 1 Then
- R = "0" & R
- End If
- G = Hex(G)
- If Len(G) = 1 Then
- G = "0" & G
- End If
- B = Hex(B)
- If Len(B) = 1 Then
- B = "0" & B
- End If
- RGB组合 = R & G & B
- End Function
- Function 取最大差值(Min, Max, Avg)
- Dim 差值1, 差值2
- 差值1 = Abs(Min - Avg)
- 差值2 = Abs(Max - Avg)
- If 差值1 > 差值2 Then
- 取最大差值 = 差值1
- Else
- 取最大差值 = 差值2
- End If
- End Function
复制代码 调用示例:TracePrint 计算RGB偏色("010203|030201") TracePrint 计算RGB偏色("000000|ffffff")调试结果:020202-010001 7F7F7F-808080
点评
江中游
分析的非常透彻
发表于 2022/7/16 21:27:25
|