- 按键认证大神
- 728264
- 3501
- 18
- 1898 朵
- 27453 个
- 1717 个
- 82980
- 2011-08-04
|
1#
t
T
发表于 2022-05-23 16:14
|
|只看楼主
本篇与【源码+思路】计算偏色之RGB篇一样,目的都是计算偏色,用于一些插件中精准识别颜色和文字。相较而言,HSV比RGB的颜色过渡与肉眼观察更直观,且数值为10进制,无需进行进制转换,但需要注意的是RGB与HSV的数值范围是不一样的。RGB数值范围: R:16进制 00~FF 10进制0~255 G:16进制 00~FF 10进制0~255 B:16进制 00~FF 10进制0~255 HSV数值范围: H:10进制 0~360 S:10进制 0~100 V:10进制 0~100思路: 1、将要计算的颜色字符串全部拆分为H、S、V。 2、将拆分出全部的H、S、V统计,统计出最大的H、S、V和最小的H、S、V,对应相加并除以二,计算的出H、S、V中间值,即为颜色范围的基础色。 3、将统计出最大的H、S、B或最小的H、S、V与H、S、V中间值对应相减,即可得到颜色范围的偏色。 4、将基础色与偏色连接,即为完整的颜色范围。 注意:H、S、V中间值计算时可能会出现小数点,应当只保留整数部分后,再取HSV中间值与HSV最大或HSV最小值中差值最大的值作为偏色。完整源码:- Function 计算HSV偏色(颜色组合)
- 颜色组合 = Split(颜色组合, "|")
- Dim i, U_颜色组合
- U_颜色组合 = UBound(颜色组合)
- Dim Min_H, Min_S, Min_V
- Dim Max_H, Max_S, Max_V
- Dim Avg_H, Avg_S, Avg_V
- Dim HSV, H, S, V, D_H, D_S, D_V
- HSV = HSV拆分(颜色组合(0))
- Min_H = HSV(0)
- Min_S = HSV(1)
- Min_V = HSV(2)
- Max_H = HSV(0)
- Max_S = HSV(1)
- Max_V = HSV(2)
- For i = 1 To U_颜色组合
- HSV = HSV拆分(颜色组合(i))
- If HSV(0) < Min_H Then
- Min_H = HSV(0)
- Else
- If HSV(0) > Max_H Then
- Max_H = HSV(0)
- End If
- End If
- If HSV(1) < Min_S Then
- Min_S = HSV(1)
- Else
- If HSV(1) > Max_S Then
- Max_S = HSV(1)
- End If
- End If
- If HSV(2) < Min_V Then
- Min_V = HSV(2)
- Else
- If HSV(2) > Max_V Then
- Max_V = HSV(2)
- End If
- End If
- Next
- Avg_H = Int((Min_H + Max_H) / 2)
- Avg_S = Int((Min_S + Max_S) / 2)
- Avg_V = Int((Min_V + Max_V) / 2)
- D_H = 取最大差值(Min_H, Max_H, Avg_H)
- D_S = 取最大差值(Min_S, Max_S, Avg_S)
- D_V = 取最大差值(Min_V, Max_V, Avg_V)
- 计算HSV偏色 = Avg_H & "." & Avg_S & "." & Avg_V & "-" & D_H & "." & D_S & "." & D_V
- End Function
- Function HSV拆分(HSV_Str)
- Dim ret
- ret = Split(HSV_Str, ".")
- HSV拆分 = Array(CInt(ret(0)), CInt(ret(1)), CInt(ret(2)))
- 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 计算HSV偏色("1.2.3|4.5.6") TracePrint 计算HSV偏色("0.0.0|360.100.100") 调试结果: 2.3.4-2.2.2180.50.50-180.50.50
|