2009-11-20 6 views
16

В PHP, какой самый простой способ конвертировать триггер RGB в значения HSV?RGB для HSV в PHP

+6

Быстрый поиск в google найден http://delphi.about.com/od/adptips2006/qt/RgbToHsb.htm. Не в PHP, но все математическое, так что это должно быть легко. – mk12

ответ

14
<?php 
function RGB_TO_HSV ($R, $G, $B) // RGB Values:Number 0-255 
{         // HSV Results:Number 0-1 
    $HSL = array(); 

    $var_R = ($R/255); 
    $var_G = ($G/255); 
    $var_B = ($B/255); 

    $var_Min = min($var_R, $var_G, $var_B); 
    $var_Max = max($var_R, $var_G, $var_B); 
    $del_Max = $var_Max - $var_Min; 

    $V = $var_Max; 

    if ($del_Max == 0) 
    { 
     $H = 0; 
     $S = 0; 
    } 
    else 
    { 
     $S = $del_Max/$var_Max; 

     $del_R = ((($var_Max - $var_R)/6) + ($del_Max/2))/$del_Max; 
     $del_G = ((($var_Max - $var_G)/6) + ($del_Max/2))/$del_Max; 
     $del_B = ((($var_Max - $var_B)/6) + ($del_Max/2))/$del_Max; 

     if  ($var_R == $var_Max) $H = $del_B - $del_G; 
     else if ($var_G == $var_Max) $H = (1/3) + $del_R - $del_B; 
     else if ($var_B == $var_Max) $H = (2/3) + $del_G - $del_R; 

     if ($H<0) $H++; 
     if ($H>1) $H--; 
    } 

    $HSL['H'] = $H; 
    $HSL['S'] = $S; 
    $HSL['V'] = $V; 

    return $HSL; 
} 
+0

Я прибрал несколько ошибок в этом коде, протестировал его против известных результатов, и он отлично работает. Благодаря! –

+0

Я пытаюсь понять, как работает HSV. Прежде чем вы вернете значения, вам не нужно умножать $ H на 360, а $ S и $ V на 100? –

+0

@JackHumphries - см. Мой ответ, чтобы немного легче следовать версии, которая также возвращает градусы и проценты. – Unsigned

29

Вот простой, простой метод, который возвращает значения HSV как градусы и проценты, что и использует выбор цвета в Photoshop.

Обратите внимание, что возвращаемые значения не округлены, вы можете сделать это сами, если потребуется. Имейте в виду, что H(360) == H(0), так H значения 359.5 и больше должны вокруг к 0

Крупной документированы для целей обучения.

/** 
* Licensed under the terms of the BSD License. 
* (Basically, this means you can do whatever you like with it, 
* but if you just copy and paste my code into your app, you 
* should give me a shout-out/credit :) 
*/ 

<?php 

function RGBtoHSV($R, $G, $B) // RGB values: 0-255, 0-255, 0-255 
{        // HSV values: 0-360, 0-100, 0-100 
    // Convert the RGB byte-values to percentages 
    $R = ($R/255); 
    $G = ($G/255); 
    $B = ($B/255); 

    // Calculate a few basic values, the maximum value of R,G,B, the 
    // minimum value, and the difference of the two (chroma). 
    $maxRGB = max($R, $G, $B); 
    $minRGB = min($R, $G, $B); 
    $chroma = $maxRGB - $minRGB; 

    // Value (also called Brightness) is the easiest component to calculate, 
    // and is simply the highest value among the R,G,B components. 
    // We multiply by 100 to turn the decimal into a readable percent value. 
    $computedV = 100 * $maxRGB; 

    // Special case if hueless (equal parts RGB make black, white, or grays) 
    // Note that Hue is technically undefined when chroma is zero, as 
    // attempting to calculate it would cause division by zero (see 
    // below), so most applications simply substitute a Hue of zero. 
    // Saturation will always be zero in this case, see below for details. 
    if ($chroma == 0) 
     return array(0, 0, $computedV); 

    // Saturation is also simple to compute, and is simply the chroma 
    // over the Value (or Brightness) 
    // Again, multiplied by 100 to get a percentage. 
    $computedS = 100 * ($chroma/$maxRGB); 

    // Calculate Hue component 
    // Hue is calculated on the "chromacity plane", which is represented 
    // as a 2D hexagon, divided into six 60-degree sectors. We calculate 
    // the bisecting angle as a value 0 <= x < 6, that represents which 
    // portion of which sector the line falls on. 
    if ($R == $minRGB) 
     $h = 3 - (($G - $B)/$chroma); 
    elseif ($B == $minRGB) 
     $h = 1 - (($R - $G)/$chroma); 
    else // $G == $minRGB 
     $h = 5 - (($B - $R)/$chroma); 

    // After we have the sector position, we multiply it by the size of 
    // each sector's arc (60 degrees) to obtain the angle in degrees. 
    $computedH = 60 * $h; 

    return array($computedH, $computedS, $computedV); 
} 

?> 
+0

Удивительный ответ. Был только то, что мне нужно, чтобы узнать, как рассчитать ценность части HSV. Ty. – Deanie

+0

Есть ли способ отменить этот процесс, преобразовывая его обратно? – JacobTheDev

+0

@JacobTheDev Конечно. [Этот вопрос] (https://stackoverflow.com/q/3018313/629493) содержит примеры. – Unsigned

Смежные вопросы