2009-11-20 38 views
16

Trong PHP, cách đơn giản nhất để chuyển đổi một bộ ba RGB sang giá trị HSV là gì?RGB đến HSV trong PHP

+6

Tìm kiếm nhanh trên google được tìm thấy http://delphi.about.com/od/adptips2006/qt/RgbToHsb.htm. Không phải trong PHP, nhưng tất cả đều là toán học nên nó phải dễ dàng. – mk12

Trả lời

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

Tôi đã dọn dẹp một vài lỗi trong mã này, kiểm tra nó với kết quả đã biết và nó hoạt động tốt. Cảm ơn! –

+0

Tôi đang cố gắng nắm bắt cách HSV hoạt động. Trước khi bạn trả lại các giá trị, bạn không phải nhân $ H với 360 và $ S và $ V lên 100? –

+0

@JackHumphries - Xem câu trả lời của tôi để có một phiên bản dễ theo dõi dễ dàng hơn, cũng trả về độ và tỷ lệ phần trăm. – Unsigned

29

Đây là phương pháp đơn giản, đơn giản trả về giá trị HSV dưới dạng độ và tỷ lệ phần trăm, đó là công cụ chọn màu của Photoshop.

Lưu ý rằng các giá trị trả về không được làm tròn, bạn có thể tự làm điều đó nếu được yêu cầu. Hãy ghi nhớ rằng H(360) == H(0), vì vậy giá trị của H359.5 và lớn nên vòng để 0

nặng nề tài liệu cho các mục đích học tập.

/** 
* 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

Câu trả lời thú vị. Chỉ là những gì tôi cần để tìm hiểu làm thế nào để tính toán phần giá trị của HSV. Ty. – Deanie

+0

Có cách nào để đảo ngược quá trình này, chuyển đổi lại không? – JacobTheDev

+0

@JacobTheDev Tất nhiên. [Câu hỏi này] (https://stackoverflow.com/q/3018313/629493) có các ví dụ. – Unsigned