Advertisement
BugFix

OKLab - RGB

Oct 17th, 2023
1,194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 1.97 KB | None | 0 0
  1. ; OKLAB     https://bottosson.github.io/posts/oklab/
  2.  
  3. $c = 0xE3E3E3
  4. ConsoleWrite('+++ convert 0x' & Hex($c,6) & ' to Lab:' & @CRLF)
  5. $lab = rgb_to_oklab($c)
  6. ConsoleWrite('--> $lab.L ' & $lab.L & @CRLF)
  7. ConsoleWrite('--> $lab.a ' & $lab.a & @CRLF)
  8. ConsoleWrite('--> $lab.b ' & $lab.b & @CRLF)
  9. ConsoleWrite('+++ convert back to RGB:' & @CRLF)
  10. ConsoleWrite('--> ' & oklab_to_rgb($lab) & @CRLF)
  11.  
  12.  
  13. Func rgb_to_oklab($_RGB, $_iRetType=0)  ; $_iRetType: 0=struct, 1=map
  14.     Local $R = BitAND(BitShift($_RGB, 16), 0xFF)
  15.     Local $G = BitAND(BitShift($_RGB, 8), 0xFF)
  16.     Local $B = BitAND($_RGB, 0xFF)
  17.     Local $l = (0.4122214708 * $R) + (0.5363325363 * $G) + (0.0514459929 * $B)
  18.     Local $m = (0.2119034982 * $R) + (0.6806995451 * $G) + (0.1073969566 * $B)
  19.     Local $s = (0.0883024619 * $R) + (0.2817188376 * $G) + (0.6299787005 * $B)
  20.  
  21.     Local $l_ = $l ^ (1/3)
  22.     Local $m_ = $m ^ (1/3)
  23.     Local $s_ = $s ^ (1/3)
  24.  
  25.     If $_iRetType = 0 Then
  26.         Local $Lab = DllStructCreate("struct;float L; float a; float b;endstruct")
  27.     Else
  28.         Local $Lab[]
  29.     EndIf
  30.     $Lab.L = (0.2104542553 * $l_) + (0.7936177850 * $m_) - (0.0040720468 * $s_)
  31.     $Lab.a = (1.9779984951 * $l_) - (2.4285922050 * $m_) + (0.4505937099 * $s_)
  32.     $Lab.b = (0.0259040371 * $l_) + (0.7827717662 * $m_) - (0.8086757660 * $s_)
  33.  
  34.     Return $Lab
  35. EndFunc
  36.  
  37. Func oklab_to_rgb($_Lab)
  38.     Local $l_ = $_Lab.L + (0.3963377774 * $_Lab.a) + (0.2158037573 * $_Lab.b)
  39.     Local $m_ = $_Lab.L - (0.1055613458 * $_Lab.a) - (0.0638541728 * $_Lab.b)
  40.     Local $s_ = $_Lab.L - (0.0894841775 * $_Lab.a) - (1.2914855480 * $_Lab.b)
  41.  
  42.     Local $l = $l_ * $l_ * $l_
  43.     Local $m = $m_ * $m_ * $m_
  44.     Local $s = $s_ * $s_ * $s_
  45.  
  46.     Local $R = Int(Round( (+4.0767416621 * $l) - (3.3077115913 * $m) + (0.2309699292 * $s), 0))
  47.     Local $G = Int(Round( (-1.2684380046 * $l) + (2.6097574011 * $m) - (0.3413193965 * $s), 0))
  48.     Local $B = Int(Round( (-0.0041960863 * $l) - (0.7034186147 * $m) + (1.7076147010 * $s), 0))
  49.  
  50.     Return '0x' & Hex($R, 2) & Hex($G, 2) & Hex($B, 2)
  51. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement