http://www.wk78.com/forum.php?mod=forumdisplay&fid=2&page=1
文件在论坛。
然后需要解决一个问题: 我直接复制过来了,自己看吧。
|
rgb颜色转换为CIELAB和XYZ颜色模型后可以用来比较颜色的识别相似值,CIE的公式我就不写了,有需要的百度吧。 晚安 |
|
|
|
|
|
|
|
本帖最后由 InkHin 于 2019-2-22 21:20 编辑
在后面计算使用的时候我发现了一个错误,由于我们的最终取值范围是【0,255】, 即最大值是一个八位的二进制,所以取值上我截取了二进制值的尾部八位。 但是由于LAB的计算是包括负数的,在该公式的运行中,我使用二进制移位来优化计算, 没有考虑到BIN_To_DEC 函数 (二进制转换十进制)进行操作时 将原二进制负数判断为整形4294967295+(由于返回是Long类型所以不会溢出),导致数据计算出现问题, 解决方法很简单。如下:
设以32位最大值为 (- 1):
1111 1111 1111 1111 1111 1111 1111 1111
十进制(为了直观) :
4294967293 -3
4294967294 -2
4294967295 -1
4294967296 0
4294967297 1 4294967298 2 4294967299 3
那么正确的值 = Value - 4294967296
———————— ——————————
可以将Mid()部分也顺便放进里面BIN_TO_DEC的函数里: 同时,由于A和B的值最后还要加上128 所以 (255 -128) = 127 < 255 ,计算得到的仍旧是一个八位的二进制值。
意味着我们只要从倒数第八位开始往左取四位,判断其是否 = “1111”,就可以筛选其是否为一个负数。
Code :
Public Function BIN_to_DEC(ByVal Bin As String, Optional Mid_Value As Byte = 8) As Currency 'Mid_Value = Mid 's length Dim i As Long, Length As Long, Ne As Boolean, Value As String Length = Len(Bin) If Mid(Bin, Length - 8 - 3, 4) = "1111" Then Value = Mid(Bin, Length - 7, 8) Value = "111111111111111111111111" & Value Ne = True Else Value = Mid(Bin, Length - (Mid_Value - 1), Mid_Value) End If Length = Len(Value) For i = 1 To Length BIN_to_DEC = BIN_to_DEC * 2 + Val(Mid(Value, i, 1)) Next i Debug.Print BIN_to_DEC If Ne = True Then BIN_to_DEC = BIN_to_DEC - Ne_BinMax End Function |
|