Advertisement
AZJIO

HSB_RGB_BGR

Sep 16th, 2011
823
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 13.85 KB | None | 0 0
  1. #include-once
  2.  
  3. ; v 0.3
  4.  
  5. ; _HSB_to_RGB
  6. ; _RGB_to_HSB
  7. ; _RGB_to_BGR
  8. ; _ColorToArray - конвертирование числового и строчного формата цвета  в массив.
  9.  
  10. ; HSB = [0-360, 0-100, 0-100]
  11. ; RGB = [0-255, 0-255, 0-255]
  12.  
  13. ; ============================================================================================
  14. ; Function Name ...: _ColorToArray
  15. ; Description ........: Convert colors from a number or string into an array
  16. ; Syntax.......: _ColorToArray ( $RGB[, $f=0] )
  17. ; Parameters:
  18. ;       $RGB - color as a string or a number
  19. ;       $f - defines the format of the data
  20. ;                  |0 - auto
  21. ;                  |1 - string, "C738B9" (Hex)
  22. ;                  |2 - array, [199, 56, 185] (Dec)
  23. ;                  |3 - number, 13056185 or 0xC738B9
  24. ;                  |4 - a string with a separator, "199, 56, 185" (Dec)
  25. ; Return values: Success - three-element array in the following format:
  26. ;                       $Array[0] = [0-255] Red
  27. ;                       $Array[1] = [0-255] Green
  28. ;                       $Array[2] = [0-255] Blue
  29. ;                   Failure - 0, and set @error
  30. ; Author(s) ..........: AZJIO
  31. ; ============================================================================================
  32. ; Имя функции ...: _ColorToArray
  33. ; Описание ........: Конвертирование цвета из числового или строчного формата в массив.
  34. ; Синтаксис.......: _ColorToArray ( $RGB[, $f=0] )
  35. ; Параметры:
  36. ;       $RGB - цвет в строковом, числовом формате
  37. ;       $f - определяет формат данных
  38. ;                  |0 - автоматически
  39. ;                  |1 - строка, например "C738B9" (шестнадцатеричное число в строке)
  40. ;                  |2 - массив, например [199, 56, 185] (имеет смысл только при $f = 0)
  41. ;                  |3 - число, например 13056185 или 0xC738B9
  42. ;                  |4 - строка с разделителем, например "199, 56, 185" (десятеричные числа)
  43. ; Возвращаемое значение: Успешно - трёх элементный массив следующего формата:
  44. ;                       $Array[0] = [0-255] Красный
  45. ;                       $Array[1] = [0-255] Зелёный
  46. ;                       $Array[2] = [0-255] Синий
  47. ;                   Неудачно - 0, устанавливает @error:
  48. ;                  |1 - не удалось парсить строку
  49. ;                  |3 - не удалось парсить число
  50. ;                  |4 - не удалось парсить строку
  51. ;                  |5 - неверный формат при автоопределении при $f = 0
  52. ; Автор ..........: AZJIO
  53. ; ============================================================================================
  54. Func _ColorToArray($RGB, $f = 0)
  55.     If Not $f Then ; Определяем тип данных
  56.         Switch VarGetType($RGB)
  57.             Case 'String'
  58.                 If StringInStr($RGB, ',') Then
  59.                     $f = 4
  60.                 Else
  61.                     $f = 1
  62.                 EndIf
  63.             Case 'Array'
  64.                 $f = 2
  65.             Case 'Int32'
  66.                 $f = 3
  67.             Case Else
  68.                 Return SetError(5, 0, 0)
  69.         EndSwitch
  70.     EndIf
  71.  
  72.     Local $aRGB[3], $aTmp, $pattern = '(?i)([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$'
  73.  
  74.     Switch $f
  75.         Case 1
  76.             $aRGB = StringRegExp($RGB, $pattern, 3) ; либо ошибка, либо 3-х элементный массив
  77.             If @error Then Return SetError(1, 0, 0)
  78.             __Arr3ToDec($aRGB)
  79.         Case 2
  80.             $aRGB = $RGB
  81.         Case 3
  82.             $aRGB = StringRegExp(Hex($RGB), $pattern, 3)
  83.             If @error Then Return SetError(3, 0, 0)
  84.             __Arr3ToDec($aRGB)
  85.         Case 4
  86.             $aRGB = StringRegExp(StringStripWS($RGB, 8), '^(\d{1,3}),(\d{1,3}),(\d{1,3})$', 3)
  87.             If @error Then Return SetError(4, 0, 0)
  88.             $aRGB[0] = Number($aRGB[0])
  89.             $aRGB[1] = Number($aRGB[1])
  90.             $aRGB[2] = Number($aRGB[2])
  91.     EndSwitch
  92.  
  93.     Return $aRGB
  94. EndFunc
  95.  
  96. Func __Arr3ToDec(ByRef $a)
  97.     $a[0] = Dec($a[0])
  98.     $a[1] = Dec($a[1])
  99.     $a[2] = Dec($a[2])
  100. EndFunc
  101.  
  102. ; округляем опционально
  103. Func _Round(ByRef $a)
  104.     $a[0] = Round($a[0])
  105.     $a[1] = Round($a[1])
  106.     $a[2] = Round($a[2])
  107. EndFunc
  108.  
  109. Func _RGB_BGR($aRGB)
  110.     $pat = $aRGB[2]
  111.     $aRGB[2] = $aRGB[0]
  112.     $aRGB[0] = $pat
  113.  
  114.     ; Return Dec($aRGB[2]&$aRGB[1]&$aRGB[0])
  115.     Return $aRGB
  116. EndFunc
  117.  
  118. ; ============================================================================================
  119. ; Function Name ...: _HSB_to_RGB
  120. ; Description ........: Converting colors from RGB to HSB
  121. ; Syntax.......: _HSB_to_RGB ( $aHSB[, $i = 0[, $iScale1 = 360[, $iScale2 = 100[, $iScale3 = 100]]]] )
  122. ; Parameters:
  123. ;       $aHSB - three-element array in the following format:
  124. ;           $aHSB[0] = [0...$iScale1] Hue
  125. ;           $aHSB[1] = [0...$iScale2] Saturation
  126. ;           $aHSB[2] = [0...$iScale3] Brightness
  127. ;       $i - [optional] формат выходных данных:
  128. ;           0 - float
  129. ;           1 - an array of integers, [0 - 255]
  130. ;           2 - an array of strings in hex [00 - FF]
  131. ;           3 - hexadecimal string [000000 - FFFFFF]
  132. ;           4 - integer color [0x000000 - 0xFFFFFF]
  133. ;       $iScale1 - [optional] maximum Hue
  134. ;       $iScale2 - [optional] maximum Saturation
  135. ;       $iScale3 - [optional] maximum Brightness
  136. ; Return values: Success - three-element array, string or number, depending on the flag $i
  137. ;                   Failure - @error = 1 - $aHSB is not a one-dimensional or three-element array
  138. ; Author(s) ..........: AZJIO, formula is taken from the wikipedia article (HSV (color model) - Wikipedia)
  139. ; ============================================================================================
  140. ; Имя функции ...: _HSB_to_RGB
  141. ; Описание ........: Конвертирование цвета из цветового пространства HSB в RGB
  142. ; Синтаксис.......: _HSB_to_RGB ( $aHSB[, $i = 0[, $iScale1 = 360[, $iScale2 = 100[, $iScale3 = 100]]]] )
  143. ; Параметры:
  144. ;       $aHSB - трёх элементный массив следующего формата:
  145. ;           $aHSB[0] = [0...$iScale1] Тон (цвет в цветовом спектре)
  146. ;           $aHSB[1] = [0...$iScale2] Насыщенность, Чистота цвета (серость или цветастость)
  147. ;           $aHSB[2] = [0...$iScale3] Яркость (тёмный или светлый)
  148. ;       $i - [необязательный] формат выходных данных:
  149. ;           0 - точные данные с плавающей точкой
  150. ;           1 - массив с целыми числами, [0 - 255]
  151. ;           2 - массив со строками в шестнадцатеричном виде [00 - FF]
  152. ;           3 - строка в шестнадцатеричном виде [000000 - FFFFFF]
  153. ;           4 - целое число цвета [0x000000 - 0xFFFFFF]
  154. ;       $iScale1 - [необязательный] максимальное значение Тон
  155. ;       $iScale2 - [необязательный] максимальное значение Насыщенность
  156. ;       $iScale3 - [необязательный] максимальное значение Яркость
  157. ; Возвращаемое значение: Успешно - трёх элементный массив, строка или число, взависимости от флага $i
  158. ;                   Неудачно - устанавливает @error равным 1 - $aHSB не является одномерным или трёх элементным массивом
  159. ; Автор ..........: AZJIO, формула взята из wikipedia в статье (HSV (цветовая модель) — Википедия)
  160. ; Примечания ..: Для вывода в GUI округляйте выходные данные до целого значения. Внутри скрипта-программы используйте не округлённые данные, это избавит от неточности при многократном преобразовании.
  161. ; ============================================================================================
  162. Func _HSB_to_RGB($aHSB, $i = 0, $iScale1 = 360, $iScale2 = 100, $iScale3 = 100)
  163.     If UBound($aHSB) <> 3 Or UBound($aHSB, 0) <> 1 Then Return SetError(1, 0, 0)
  164.     Local $aRGB[3], $f, $p, $q, $t, $Sector
  165.    
  166.     $aHSB[2] /= $iScale3
  167.    
  168.     If $aHSB[1] = 0 Then
  169.         $aRGB[0] = $aHSB[2]
  170.         $aRGB[1] = $aRGB[0]
  171.         $aRGB[2] = $aRGB[0]
  172.     Else
  173.         While $aHSB[0] >= $iScale1
  174.             $aHSB[0] -= $iScale1
  175.         WEnd
  176.        
  177.         $aHSB[1] /= $iScale2
  178.         $aHSB[0] /= $iScale1 / 6
  179.         $Sector = Int($aHSB[0])
  180.        
  181.         $f = $aHSB[0] - $Sector
  182.         $p = $aHSB[2] * (1 - $aHSB[1])
  183.         $q = $aHSB[2] * (1 - $aHSB[1] * $f)
  184.         $t = $aHSB[2] * (1 - $aHSB[1] * (1 - $f))
  185.        
  186.         Switch $Sector
  187.             Case 0
  188.                 $aRGB[0] = $aHSB[2]
  189.                 $aRGB[1] = $t
  190.                 $aRGB[2] = $p
  191.             Case 1
  192.                 $aRGB[0] = $q
  193.                 $aRGB[1] = $aHSB[2]
  194.                 $aRGB[2] = $p
  195.             Case 2
  196.                 $aRGB[0] = $p
  197.                 $aRGB[1] = $aHSB[2]
  198.                 $aRGB[2] = $t
  199.             Case 3
  200.                 $aRGB[0] = $p
  201.                 $aRGB[1] = $q
  202.                 $aRGB[2] = $aHSB[2]
  203.             Case 4
  204.                 $aRGB[0] = $t
  205.                 $aRGB[1] = $p
  206.                 $aRGB[2] = $aHSB[2]
  207.             Case Else
  208.                 $aRGB[0] = $aHSB[2]
  209.                 $aRGB[1] = $p
  210.                 $aRGB[2] = $q
  211.         EndSwitch
  212.     EndIf
  213.     $aRGB[0] *= 255
  214.     $aRGB[1] *= 255
  215.     $aRGB[2] *= 255
  216.    
  217.     ; В UDF Color.au3 - Global Const $__COLORCONSTANTS_RGBMAX = 255 ; устанавливает коэффициент RGB, но по умолчанию в большинстве случаев он равен 255 всегда.
  218.     If $i Then
  219.         $aRGB[0] = Round($aRGB[0]) ; если $aHSB[1] = 0 то можно сэкономить на вычислениях
  220.         $aRGB[1] = Round($aRGB[1])
  221.         $aRGB[2] = Round($aRGB[2])
  222.         If $i > 1 Then
  223.             $aRGB[0] = Hex($aRGB[0], 2)
  224.             $aRGB[1] = Hex($aRGB[1], 2)
  225.             $aRGB[2] = Hex($aRGB[2], 2)
  226.             If $i > 2 Then
  227.                 $aRGB = $aRGB[0] & $aRGB[1] & $aRGB[2]
  228.                 If $i > 3 Then
  229.                     $aRGB = Dec($aRGB[0] & $aRGB[1] & $aRGB[2])
  230.                 EndIf
  231.             EndIf
  232.         EndIf
  233.     EndIf
  234.    
  235.     Return $aRGB
  236. EndFunc
  237.  
  238. ; ============================================================================================
  239. ; Function Name ...: _RGB_to_HSB
  240. ; Description ........: Converting colors from RGB to HSB
  241. ; Syntax.......: _RGB_to_HSB ( $aRGB[, $iScale1 = 360[, $iScale2 = 100[, $iScale3 = 100]]] )
  242. ; Parameters:
  243. ;       $aRGB - three-element array in the following format:
  244. ;           $aRGB[0] = [0 - 255] Red
  245. ;           $aRGB[1] = [0 - 255] Green
  246. ;           $aRGB[2] = [0 - 255] Blue
  247. ;       $iScale1 - [optional] maximum Hue
  248. ;       $iScale2 - [optional] maximum Saturation
  249. ;       $iScale3 - [optional] maximum Brightness
  250. ; Return values: Success - three-element array in the following format:
  251. ;                       $aHSB[0] = [0...$iScale1] Hue
  252. ;                       $aHSB[1] = [0...$iScale2] Saturation
  253. ;                       $aHSB[2] = [0...$iScale3] Brightness
  254. ;                   Failure - @error = 1 - $aRGB нis not a one-dimensional or three-element array
  255. ; Author(s) ..........: AZJIO, formula is taken from the wikipedia article (HSV (color model) - Wikipedia)
  256. ; ============================================================================================
  257. ; Имя функции ...: _RGB_to_HSB
  258. ; Описание ........: Конвертирование цвета из цветового пространства RGB в HSB
  259. ; Синтаксис.......: _RGB_to_HSB ( $aRGB[, $iScale1 = 360[, $iScale2 = 100[, $iScale3 = 100]]] )
  260. ; Параметры:
  261. ;       $aRGB - трёх элементный массив следующего формата:
  262. ;           $aRGB[0] = [0 - 255] Красный
  263. ;           $aRGB[1] = [0 - 255] Зелёный
  264. ;           $aRGB[2] = [0 - 255] Синий
  265. ;       $iScale1 - [необязательный] максимальное значение Тон
  266. ;       $iScale2 - [необязательный] максимальное значение Насыщенность
  267. ;       $iScale3 - [необязательный] максимальное значение Яркость
  268. ; Возвращаемое значение: Успешно - трёх элементный массив следующего формата:
  269. ;                       $aHSB[0] = [0...$iScale1] Тон (цвет в цветовом спектре)
  270. ;                       $aHSB[1] = [0...$iScale2] Насыщенность, Чистота цвета (серость или цветастость)
  271. ;                       $aHSB[2] = [0...$iScale3] Яркость (тёмный или светлый)
  272. ;                   Неудачно - устанавливает @error равным 1 - $aRGB не является одномерным или трёх элементным массивом
  273. ; Автор ..........: AZJIO, формула взята из wikipedia в статье (HSV (цветовая модель) — Википедия)
  274. ; Примечания ..: Для вывода в GUI округляйте выходные данные до целого значения. Внутри скрипта-программы используйте не округлённые данные, это избавит от неточности при многократном преобразовании.
  275. ; ============================================================================================
  276. Func _RGB_to_HSB($aRGB, $iScale1 = 360, $iScale2 = 100, $iScale3 = 100)
  277.     If UBound($aRGB) <> 3 Or UBound($aRGB, 0) <> 1 Then Return SetError(1, 0, 0)
  278.     Local $min, $max, $aHSB[3]
  279.    
  280.     $aRGB[0] /= 255
  281.     $aRGB[1] /= 255
  282.     $aRGB[2] /= 255
  283.    
  284.     If $aRGB[0] <= $aRGB[1] Then
  285.         $min = $aRGB[0]
  286.         $max = $aRGB[1]
  287.     Else
  288.         $min = $aRGB[1]
  289.         $max = $aRGB[0]
  290.     EndIf
  291.     If $min > $aRGB[2] Then $min = $aRGB[2]
  292.     If $max < $aRGB[2] Then $max = $aRGB[2]
  293.    
  294.     If $max = $min Then
  295.         $aHSB[0] = 0
  296.     ElseIf $max = $aRGB[0] Then
  297.         $aHSB[0] = $iScale1 / 6 * ($aRGB[1] - $aRGB[2]) / ($max - $min)
  298.         If $aRGB[1] < $aRGB[2] Then $aHSB[0] += $iScale1
  299.     ElseIf $max = $aRGB[1] Then
  300.         $aHSB[0] = $iScale1 / 6 * ($aRGB[2] - $aRGB[0]) / ($max - $min) + $iScale1 / 3
  301.     ElseIf $max = $aRGB[2] Then
  302.         $iScale1 /= 6
  303.         $aHSB[0] = $iScale1 * ($aRGB[0] - $aRGB[1]) / ($max - $min) + $iScale1 * 4
  304.     EndIf
  305.    
  306.     If $max = 0 Then
  307.         $aHSB[1] = 0
  308.     Else
  309.         $aHSB[1] = (1 - $min / $max) * $iScale2
  310.     EndIf
  311.    
  312.     $aHSB[2] = $max * $iScale3
  313.    
  314.     Return $aHSB
  315. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement