• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[昨夜星辰] 【源码+思路】计算偏色之RGB篇 [复制链接]

1#
我们在进行颜色或文字识别时,经常会遇到颜色过于复杂的情况,那么就需要填写很多颜色才能识别。遇到这种情况就会造成一些麻烦,诸如颜色参数填写太长或插件对颜色个数有限制(大漠插件仅允许最多支持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"。
  1. Function RGB拆分(RGB_Str)
  2. RGB拆分 = Array(Eval("&H"&Mid(RGB_Str, 1, 2)), Eval("&H"&Mid(RGB_Str, 3, 2)), Eval("&H"&Mid(RGB_Str, 5, 2)))
  3. End Function
复制代码
2、R、G、B中间值计算时可能会出现小数点,应当只保留整数部分后,再取RGB中间值与RBG最大或RGB最小值中差值最大的值作为偏色。
  1. Function 取最大差值(Min, Max, Avg)
  2. Dim 差值1, 差值2
  3. 差值1 = Abs(Min - Avg)
  4. 差值2 = Abs(Max - Avg)
  5. If 差值1 > 差值2 Then
  6. 取最大差值 = 差值1
  7. Else
  8. 取最大差值 = 差值2
  9. End If
  10. End Function
复制代码
3、由于R、G、B每种颜色为2位长度,所以在10进制转换为16进制时,若转换后的颜色为1位长度,需要"0"&连接颜色,否则颜色不正确。
  1. Function RGB组合(R, G, B)
  2. R = Hex(R)
  3. If Len(R) = 1 Then
  4. R = "0" & R
  5. End If
  6. G = Hex(G)
  7. If Len(G) = 1 Then
  8. G = "0" & G
  9. End If
  10. B = Hex(B)
  11. If Len(B) = 1 Then
  12. B = "0" & B
  13. End If
  14. RGB组合 = R & G & B
  15. End Function
复制代码
完整源码:
  1. Function 计算RGB偏色(颜色组合)
  2. 颜色组合 = Split(颜色组合, "|")
  3. Dim i, U_颜色组合
  4. U_颜色组合 = UBound(颜色组合)
  5. Dim Min_R, Min_G, Min_B
  6. Dim Max_R, Max_G, Max_B
  7. Dim Avg_R, Avg_G, Avg_B
  8. Dim RGB, R, G, B, D_R, D_G, D_B
  9. RGB = RGB拆分(颜色组合(0))
  10. Min_R = RGB(0)
  11. Min_G = RGB(1)
  12. Min_B = RGB(2)
  13. Max_R = RGB(0)
  14. Max_G = RGB(1)
  15. Max_B = RGB(2)
  16. For i = 1 To U_颜色组合
  17. RGB = RGB拆分(颜色组合(i))
  18. If RGB(0) < Min_R Then
  19. Min_R = RGB(0)
  20. Else
  21. If RGB(0) > Max_R Then
  22. Max_R = RGB(0)
  23. End If
  24. End If
  25. If RGB(1) < Min_G Then
  26. Min_G = RGB(1)
  27. Else
  28. If RGB(1) > Max_G Then
  29. Max_G = RGB(1)
  30. End If
  31. End If
  32. If RGB(2) < Min_B Then
  33. Min_B = RGB(2)
  34. Else
  35. If RGB(2) > Max_B Then
  36. Max_B = RGB(2)
  37. End If
  38. End If
  39. Next
  40. Avg_R = Int((Min_R + Max_R) / 2)
  41. Avg_G = Int((Min_G + Max_G) / 2)
  42. Avg_B = Int((Min_B + Max_B) / 2)
  43. D_R = 取最大差值(Min_R, Max_R, Avg_R)
  44. D_G = 取最大差值(Min_G, Max_G, Avg_G)
  45. D_B = 取最大差值(Min_B, Max_B, Avg_B)
  46. 计算RGB偏色 = RGB组合(Avg_R, Avg_G, Avg_B) &"-"& RGB组合(D_R, D_G, D_B)
  47. End Function
  48. Function RGB拆分(RGB_Str)
  49. RGB拆分 = Array(Eval("&H"&Mid(RGB_Str, 1, 2)), Eval("&H"&Mid(RGB_Str, 3, 2)), Eval("&H"&Mid(RGB_Str, 5, 2)))
  50. End Function
  51. Function RGB组合(R, G, B)
  52. R = Hex(R)
  53. If Len(R) = 1 Then
  54. R = "0" & R
  55. End If
  56. G = Hex(G)
  57. If Len(G) = 1 Then
  58. G = "0" & G
  59. End If
  60. B = Hex(B)
  61. If Len(B) = 1 Then
  62. B = "0" & B
  63. End If
  64. RGB组合 = R & G & B
  65. End Function
  66. Function 取最大差值(Min, Max, Avg)
  67. Dim 差值1, 差值2
  68. 差值1 = Abs(Min - Avg)
  69. 差值2 = Abs(Max - Avg)
  70. If 差值1 > 差值2 Then
  71. 取最大差值 = 差值1
  72. Else
  73. 取最大差值 = 差值2
  74. End If
  75. End Function
复制代码

调用示例:
TracePrint 计算RGB偏色("010203|030201")
TracePrint 计算RGB偏色("000000|ffffff")

调试结果:
020202-010001
7F7F7F-808080

点评

江中游  分析的非常透彻  发表于 2022/7/16 21:27:25

最后编辑昨夜星辰 最后编辑于 2022-05-22 11:38:16
本主题由 超级版主 瑞祥幽冥狼 于 2023/10/5 18:35:52 执行 审核帖子 操作
近期制作:
传奇私服各种反外挂插件版本挂机软件,可教可售
原神加速、连发辅助工具
天下3自动钓大鱼辅助工具

承接脚本定制,点击下方联系
QQ:250039815

交流群:101296478

2#

学习一下。。。。。。。。。。。。。。。。

3#

就是不想用大漠 能不能用 原生命令做出有偏色功能的多點找色函數 pc版的

点评

昨夜星辰  能做出来,但是效率很低。算法和语言都决定了比大漠快是很难的。  发表于 2022/5/22 15:07:31

4#

进来学习下大神的写法。

5#

学习大师的写作技巧,辛苦了~

6#

66666666

7#

厉害厉害 要学习啊啊

8#

就是不想用大漠 能不能用 原生命令做出有偏色功能的多點找色函數 pc版的

9#

感谢分享,学习

10#


11#

看看啥情况

12#

太牛了吧

13#

TracePrint 计算RGB偏色("010203|030201")

14#

好东西找了很久了

15#

学习一下

16#

Thanks for your sharing,Let me learn it

17#

学习学习

18#

进来学习下大神的写法

19#

向大佬学学学习

20#

正需要,专门回复看看大神解决思路

发新话题 回复该主题