Что нового

Перевод цвета из RGB в HSB и обратно

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Функции для перевода цвета из цветовой модели RGB (Red, Green, Blue) в цветовую модель HSB (Hue, Saturation, Brightness) и наобоот (aka Photoshop). В обоих случаях входным и выходным параметрами служит массив, содержащий три составляющие соответствующего цвета. В качестве наглядного примера можно рассматривать ColorChooser.au3.

RGB -> HSB
Код:
Func _RGB2HSB($aRGB)

	Local $Min = 255, $Max = 0
    Local $HSB[3], $D, $H

	For $i = 0 To 2
		If $aRGB[$i] > $Max Then
			$Max = $aRGB[$i]
		EndIf
		If $aRGB[$i] < $Min Then
			$Min = $aRGB[$i]
		EndIf
	Next
    If $Min = $Max Then
        $HSB[0] = 0
        $HSB[1] = 0
        $HSB[2] = $Max / 255
    Else
        If $aRGB[0] = $Min Then
            $D = $aRGB[1] - $aRGB[2]
            $H = 3
        Else
			If $aRGB[1] = $Min Then
				$D = $aRGB[2] - $aRGB[0]
				$H = 5
			Else
				$D = $aRGB[0] - $aRGB[1]
				$H = 1
			EndIf
		EndIf
        $HSB[0] = ($H - ($D / ($Max - $Min))) / 6
        $HSB[1] = ($Max - $Min) / $Max
        $HSB[2] = $Max / 255
    EndIf
	$HSB[0] = Round($HSB[0] * 360)
	If $HSB[0] = 360 Then
		$HSB[0] = 0
	EndIf
	For $i = 1 To 2
		$HSB[$i] = Round($HSB[$i] * 100)
	Next
    Return $HSB
EndFunc   ;==>_RGB2HSB

HSB -> RGB
Код:
Func _HSB2RGB($aHSB)

	Local $RGB[3], $H, $L, $F, $P, $Q, $T

	For $i = 1 To 2
		$aHSB[$i] /= 100
	Next
	If $aHSB[1] = 0 Then
		For $i= 0 To 2
			$RGB[$i] = $aHSB[2]
		Next
	Else
		$H = $aHSB[0] / 60
		$L = Floor($H)
		$F = $H - $L
		$P = $aHSB[2] * (1 - $aHSB[1])
		$Q = $aHSB[2] * (1 - $aHSB[1] * $F)
		$T = $aHSB[2] * (1 - $aHSB[1] * (1 - $F))
		Switch $L
			Case 1
				$RGB[0] = $Q
				$RGB[1] = $aHSB[2]
				$RGB[2] = $P
			Case 2
				$RGB[0] = $P
				$RGB[1] = $aHSB[2]
				$RGB[2] = $T
			Case 3
				$RGB[0] = $P
				$RGB[1] = $Q
				$RGB[2] = $aHSB[2]
			Case 4
				$RGB[0] = $T
				$RGB[1] = $P
				$RGB[2] = $aHSB[2]
			Case 5
				$RGB[0] = $aHSB[2]
				$RGB[1] = $P
				$RGB[2] = $Q
			Case Else
				$RGB[0] = $aHSB[2]
				$RGB[1] = $T
				$RGB[2] = $P
		EndSwitch
	EndIf
	For $i = 0 To 2
		$RGB[$i] = Round($RGB[$i] * 255)
	Next
	Return $RGB
EndFunc   ;==>_HSB2RGB
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Немного уйду в оффтоп :-[
Искал формулу для перевода из RGB в CMYK, практически везде одинаковые формулы с небольшими изменениями, для примера http://www.easyrgb.com/index.php?X=MATH&H=13#text13, а здесь готовый онлайн-конвертер - http://web.forret.com/tools/color.asp?R=200&G=10&B=50.
Но смущает одна вещь - в результате перевода ВСЕГДА хотя бы один из цветов будет равным нулю. Пример на AutoIt:
Код:
$r = 200
$g = 10
$b = 50

$c = 1 - ($r/255)
$m = 1 - ($g/255)
$y = 1 - ($b/255)
$k = 1

If $c < $k Then $k = $c
If $m < $k Then $k = $m
If $y < $k Then $k = $y
If $k = 1 Then ; black color
	$c = 0
	$m = 0
	$y = 0
Else
	$c = Round(($c - $k)/(1 - $k), 3)
	$m = Round(($m - $k)/(1 - $k), 3)
	$y = Round(($y - $k)/(1 - $k), 3)
	$k = Round($k, 3)
EndIf

MsgBox(0, 'RGB --> CMYK', 'RGB: ' & $r & ' | ' & $g & ' | ' & $b & @CRLF & 'CMYK: ' & $c & ' | ' & $m & ' | ' & $y & ' | ' & $k)


Если ввести эти цвета (RGB) в палитре фотошопа, там идет выдача в нескольких схемах, в том числе и в CMYK, дак вот там расчет ведется совсем по другому :smile:, думаю формула фотошопа наиболее правдива (почти никаких нулевых цветов).
Может кто знает эту секретную формулу или способ ее получить? :-\
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Секретной формулы нет. Во-первых цветовое пространство CMYK уже RGB, поэтому, как правило, перевод в CMYK связан с потерями в цвете. Во-вторых CMYK используется только для устройств печати и соответственно необходимо учитывать свойства принтеров, печтных машин и т.д. (см. Color Settings в Photoshop'е). Твоя формула, это всего лишь один из вариантов (самый неправильный) перевода RGB в CMYK.

Например, переводим (0; 0; 255) в CMYK с помощью твоих формул. Получаем (100; 100; 0; 0), Но это неправильно. Полученный цвет, это максимально приближенный к исходному, но далек от Blue. (0; 0; 255) вообще нельзя получить в пространстве CMYK, как и многие другие цвета. Такие цвета обычно печатают отдельными красками (Pantone).
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Спасибо за разъяснения.
 
Верх