2010-12-11 77 views
1

這裏有一個noob問題。RGB到HSL轉換似乎沒問題,但不是在視覺上

  1. 假設我具有RGB值:R:53,G:37和B:11
  2. 所以我設定的矩形的背景顏色與:

    [UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00];

  3. 現在我做一個RGB到HSL轉換,產生:H:0.10,S:0.16和L:0.13

  4. 所以我設置了同一個矩形的背景顏色:

    [UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00];

的事情是,HSL顏色看起來沒有像RGB色彩。我將我的轉換結果與在線轉換器進行了比較,就我所知,它看起來沒問題。

我很可能會解釋錯誤的東西。

+0

顯示你的代碼,你設置背景顏色。您可能還想發佈截圖,因爲這是一個視覺錯誤。您可以將圖像作爲直接上傳內嵌到您的問題中。 – 2010-12-11 00:59:10

回答

4

UIColor函數應用與HSL不同的HSB。

+0

哦!看起來我混合了HSL vs HSV/HSB。哦,男人,浪費時間轉換成錯誤的格式。謝謝! – TrekOnTV2017 2010-12-11 01:07:21

1

正如多米尼克所指出的那樣,您混淆了HSB/HSV和HSL。

Here you'll find as Category的UIImage的轉換到HSB

編輯
鏈接現在爲我從代碼創建一個要點。我在另一個github project中發現了它。

+0

謝謝。我在看,但不知道如何從UIColor中獲得HSB值。是的,我是一個大白菜:-)。所以我決定寫我自己的轉換方法。哪個去了,除了HSB - HSL假通行證 – TrekOnTV2017 2010-12-11 01:30:38

+0

有沒有人有該代碼的非死鏈接?該網站幾乎看起來像是被蹲了。 – Diziet 2012-04-03 10:03:37

+1

給我一點時間。我創建了該代碼的要點 – vikingosegundo 2012-04-03 11:44:17

0

這裏是一個開放源代碼的Drupals顏色函數+一些不同的程序員工作混合成一個單獨的函數吹噓RGB> HSL和後面的混合。它完美無瑕。

<?php 
### RGB >> HSL 
function _color_rgb2hsl($rgb) { 
    $r = $rgb[0]; $g = $rgb[1]; $b = $rgb[2]; 
    $min = min($r, min($g, $b)); $max = max($r, max($g, $b)); 
    $delta = $max - $min; $l = ($min + $max)/2; $s = 0; 
    if ($l > 0 && $l < 1) { 
    $s = $delta/($l < 0.5 ? (2 * $l) : (2 - 2 * $l)); 
    } 
    $h = 0; 
    if ($delta > 0) { 
    if ($max == $r && $max != $g) $h += ($g - $b)/$delta; 
    if ($max == $g && $max != $b) $h += (2 + ($b - $r)/$delta); 
    if ($max == $b && $max != $r) $h += (4 + ($r - $g)/$delta); 
    $h /= 6; 
    } return array($h, $s, $l); 
} 

### HSL >> RGB 
function _color_hsl2rgb($hsl) { 
    $h = $hsl[0]; $s = $hsl[1]; $l = $hsl[2]; 
    $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l*$s; 
    $m1 = $l * 2 - $m2; 
    return array(_color_hue2rgb($m1, $m2, $h + 0.33333), 
       _color_hue2rgb($m1, $m2, $h), 
       _color_hue2rgb($m1, $m2, $h - 0.33333)); 
} 

### Helper function for _color_hsl2rgb(). 
function _color_hue2rgb($m1, $m2, $h) { 
    $h = ($h < 0) ? $h + 1 : (($h > 1) ? $h - 1 : $h); 
    if ($h * 6 < 1) return $m1 + ($m2 - $m1) * $h * 6; 
    if ($h * 2 < 1) return $m2; 
    if ($h * 3 < 2) return $m1 + ($m2 - $m1) * (0.66666 - $h) * 6; 
    return $m1; 
} 

### Convert a hex color into an RGB triplet. 
function _color_unpack($hex, $normalize = false) { 
    if (strlen($hex) == 4) { 
    $hex = $hex[1] . $hex[1] . $hex[2] . $hex[2] . $hex[3] . $hex[3]; 
    } $c = hexdec($hex); 
    for ($i = 16; $i >= 0; $i -= 8) { 
    $out[] = (($c >> $i) & 0xFF)/($normalize ? 255 : 1); 
    } return $out; 
} 

### Convert an RGB triplet to a hex color. 
function _color_pack($rgb, $normalize = false) { 
    foreach ($rgb as $k => $v) { 
    $out |= (($v * ($normalize ? 255 : 1)) << (16 - $k * 8)); 
    }return '#'. str_pad(dechex($out), 6, 0, STR_PAD_LEFT); 
} 

/* $testrgb = array(0.2,0.75,0.4); //RGB to start with 
print_r($testrgb); */ 
     print "Hex: "; 

    $testhex = "#b7b700"; 
     print $testhex; 

    $testhex2rgb = _color_unpack($testhex,true); 
     print "<br />RGB: "; 

    var_dump($testhex2rgb); 
     print "<br />HSL color module: "; 

    $testrgb2hsl = _color_rgb2hsl($testhex2rgb); //Converteren naar HSL 

    var_dump($testrgb2hsl); 
     print "<br />RGB: "; 

    $testhsl2rgb = _color_hsl2rgb($testrgb2hsl); // En weer terug naar RGB  
    var_dump($testhsl2rgb); 
     print "<br />Hex: "; 

    $testrgb2hex = _color_pack($testhsl2rgb,true); 
    var_dump($testrgb2hex); 

?> 
+1

謝謝,看起來不錯 – TrekOnTV2017 2011-03-04 05:08:03