http://www.wk78.com/forum.php?mod=forumdisplay&fid=2&page=1

文件在论坛。

然后需要解决一个问题: 我直接复制过来了,自己看吧。

本帖最后由 InkHin 于 2019-2-22 21:33 编辑

—————请注意三楼的回复———————

'需要添加一个常数声明:
Public Const Ne_BinMax As Double = 4294967296#
'然后把三楼的函数复制替换,其他自己改改就能用了。

InkHin_颜色空间转换算法

File{
         RGB2CIELAB  取值范围[0,255]   
         RGB2CIEXYZ  取值范围[0,255]
         举杯邀明月的移位操作对象库
}

公式:
                      RGB2CIEXYZ :

[X]        [0.433953    0.376219    0.189828 ]    [R]

[Y]     =  [0.212671    0.715160    0.072169 ]    [G]       (3)

[Z]        [0.017758    0.109477    0.872765 ]    [B]

[R]        [3.0799327   -1.537150   -0.542782]  [X]

[G]     =  [-0.921235   1.875992    0.0452442]  [Y]      (4)

[B]        [0.0528909  -0.204043  1.1511515  ]   [Z]

RGB2CIELAB :

CIELAB 与 RGB之间没有直接的公式可以转换,所以需要用XYZ来做中间层。

<ignore_js_op>            
其中

<ignore_js_op>

<ignore_js_op> InkHin_Cie.rar (20.39 KB, 下载次数: 2)

 
 
 
   

1

主题

7

帖子

44

积分

新手上路

积分
44

沙发

 
  楼主| 发表于 昨天 23:08 | 只看该作者
rgb颜色转换为CIELAB和XYZ颜色模型后可以用来比较颜色的识别相似值,CIE的公式我就不写了,有需要的百度吧。 晚安
 
 
 
 
 管理

   

1

主题

7

帖子

44

积分

新手上路

积分
44

板凳

 
  楼主| 发表于 3 小时前 | 只看该作者
转换函数有问题,我等一会修正。
 
 
 
 
 管理

   

1

主题

7

帖子

44

积分

新手上路

积分
44

地板

 
  楼主| 发表于 半小时前 | 只看该作者
本帖最后由 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

最新文章

  1. ES6学习笔记二
  2. Java--笔记(3)
  3. CDN的实现原理
  4. 【转】重新封装FetchUrl函数一枚,支持COOKIES,喜欢领走~!
  5. NSProgress
  6. 窥探算法之美妙——寻找数组中最小的K个数&amp;python中巧用最大堆
  7. 详解定位—&gt;&quot;position&quot;
  8. Cookie Session Cache
  9. ThinkPHP实现RBAC
  10. 获取Location
  11. Android - 用Fragments实现动态UI
  12. Mongo DB 初识
  13. 洛谷1027 Car的旅行路线
  14. LeetCode算法题-Longest Palindrome(五种解法)
  15. python循环字符转换
  16. 2018软工实践—Beta冲刺(2)
  17. streamsets 错误记录处理
  18. 原生JS实现JQuery的addClass和removeClass
  19. volatile关键字到底做了什么?
  20. Struts2的fliter与interceptor

热门文章

  1. Excel 导入 Mysql
  2. Pyhon 逻辑运算符
  3. Spring常用的三种注入方式
  4. Day11字符串 title
  5. JSON AST 生成MD
  6. Centos 7 LVM xfs文件系统修复
  7. 6.824 LAB1 环境搭建
  8. @EnableEurekaServer无法正常import原因是spring-cloud-dependencies版本太低
  9. crf++实现中文分词简单例子 (Windows crf++0.58 python3)
  10. Java核心-多线程-并发控制器-CountDownLatch倒数闩