2010-08-30 17 views
15

मैं एचएसवीको आरजीबी मूल्यों में बदल सकते हैं निम्न कोड के साथ ...पीएचपी एचएसवी

$r = $r/255; 
$g = $g/255; 
$b = $b/255; 

$h = 0; 
$s = 0; 
$v = 0; 

$min = min(min($r, $g),$b); 
$max = max(max($r, $g),$b); 

$r = $max-$min; 
$v = $max; 


if($r == 0){ 
    $h = 0; 
    $s = 0; 
} 
else { 
    $s = $r/$max; 

    $hr = ((($max - $r)/6) + ($r/2))/$r; 
    $hg = ((($max - $g)/6) + ($r/2))/$r; 
    $hb = ((($max - $b)/6) + ($r/2))/$r; 

    if ($r == $max) $h = $hb - $hg; 
    else if($g == $max) $h = (1/3) + $hr - $hb; 
    else if ($b == $max) $h = (2/3) + $hg - $hr; 

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

लेकिन आप कैसे परिवर्तित एचएसवीआरजीबी को में PHP ???

निम्नलिखित विकिपीडिया पर है, लेकिन मैं यह समझ में नहीं आता,

मैं यह बहुत स्पष्ट है अनुमान लगा रहा हूँ

alt text

+0

वहाँ सूत्रों यहां हैं: http://en.wikipedia.org/wiki/HSV_color_space#Conversion_from_RGB_to_HSL_or_HSV – NullUserException

+1

मुझे पता है, लेकिन किसी फार्मूले –

+0

है इस सूत्र की व्याख्या कर सकते ** वास्तव में ** आप के लिए काम? क्योंकि आपने $ आर वैरिएबल को फिर से पेश किया है (गतिशील भाषा की तरह कुछ नहीं ...)। – greenoldman

उत्तर

15

इस रेंज में एचएसवी मूल्यों के लिए है [0,1] (और [0,1] की श्रेणी में आरजीबी मूल्यों को {0, 1, ..., 255}:

function HSVtoRGB(array $hsv) { 
    list($H,$S,$V) = $hsv; 
    //1 
    $H *= 6; 
    //2 
    $I = floor($H); 
    $F = $H - $I; 
    //3 
    $M = $V * (1 - $S); 
    $N = $V * (1 - $S * $F); 
    $K = $V * (1 - $S * (1 - $F)); 
    //4 
    switch ($I) { 
     case 0: 
      list($R,$G,$B) = array($V,$K,$M); 
      break; 
     case 1: 
      list($R,$G,$B) = array($N,$V,$M); 
      break; 
     case 2: 
      list($R,$G,$B) = array($M,$V,$K); 
      break; 
     case 3: 
      list($R,$G,$B) = array($M,$N,$V); 
      break; 
     case 4: 
      list($R,$G,$B) = array($K,$M,$V); 
      break; 
     case 5: 
     case 6: //for when $H=1 is given 
      list($R,$G,$B) = array($V,$M,$N); 
      break; 
    } 
    return array($R, $G, $B); 
} 
+0

से आपका क्या मतलब है यह सीमा [0,1] में एचएसवी मानों के लिए है (और {0, 1, ..., 255} की बजाय श्रेणी [0,1] में आरजीबी मान देना कृपया –

+0

समझाएं मेरा मतलब है कि मान 0 और 1. – Artefacto

+1

ओह के बीच होना चाहिए, इसलिए एच: 0, एस: 100 और वी: 100 के बजाय यह होना चाहिए: 0 एस: 1 वी: 1 –

1
private class HSLPixel{ 
     double hue; 
     double saturation; 
     double lightness; 

     .... your code 
} 

public Color HSLToRGB(HSLPixel pixel){ 

      double v; 
      double r,g,b; 
      double l = pixel.lightness; 
      double h = pixel.hue; 
      double s = pixel.saturation; 

      r = l; // default to gray 
      g = l; 
      b = l; 
      v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s); 
      if (v > 0){ 
        double m; 
        double sv; 
        int sextant; 
        double fract, vsf, mid1, mid2; 

        m = l + l - v; 
        sv = (v - m)/v; 
        h *= 6.0; 
        sextant = (int)h; 
        fract = h - sextant; 
        vsf = v * sv * fract; 
        mid1 = m + vsf; 
        mid2 = v - vsf; 

        switch (sextant) 
        { 
         case 0: 
           r = v; 
           g = mid1; 
           b = m; 
           break; 
         case 1: 
           r = mid2; 
           g = v; 
           b = m; 
           break; 
         case 2: 
           r = m; 
           g = v; 
           b = mid1; 
           break; 
         case 3: 
           r = m; 
           g = mid2; 
           b = v; 
           break; 
         case 4: 
           r = mid1; 
           g = m; 
           b = v; 
           break; 
         case 5: 
           r = v; 
           g = m; 
           b = mid2; 
           break; 
        } 
      } 
      Color rgb = new Color((int)(r * 255.0), (int)(g * 255.0), (int)(b * 255.0)); 
      return rgb; 
    } 
+0

क्या आप इसे PHP में कार्यान्वित कर सकते हैं ??? –

0

बेशक आप फ़ंक्शन परिभाषाओं को php शैली में बदल सकते हैं, सभी चर बदल सकते हैं आदि, लेकिन कोर कोड को वही रखें, इसे करने के लिए आपको 30 मिनट से अधिक समय नहीं लेना चाहिए और इसका परीक्षण करना चाहिए। सी से एचएसएल के लिए

+0

मैं सी अच्छी तरह से बात नहीं करता .. –

+0

इसे एक शॉट दें और जिन लाइनों पर आप अटक जाते हैं, उन्हें पूछें, मैंने पहले कभी php नहीं किया है। – rolls

+0

मैं शुरुआत में फंस गया हूं, लेकिन यह एक बहुत अच्छा उदाहरण है! मैं इसे –

5

रोल के अनुवाद का जवाब PHP के लिए

function ColorHSLToRGB($h, $s, $l){ 

     $r = $l; 
     $g = $l; 
     $b = $l; 
     $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s); 
     if ($v > 0){ 
       $m; 
       $sv; 
       $sextant; 
       $fract; 
       $vsf; 
       $mid1; 
       $mid2; 

       $m = $l + $l - $v; 
       $sv = ($v - $m)/$v; 
       $h *= 6.0; 
       $sextant = floor($h); 
       $fract = $h - $sextant; 
       $vsf = $v * $sv * $fract; 
       $mid1 = $m + $vsf; 
       $mid2 = $v - $vsf; 

       switch ($sextant) 
       { 
        case 0: 
          $r = $v; 
          $g = $mid1; 
          $b = $m; 
          break; 
        case 1: 
          $r = $mid2; 
          $g = $v; 
          $b = $m; 
          break; 
        case 2: 
          $r = $m; 
          $g = $v; 
          $b = $mid1; 
          break; 
        case 3: 
          $r = $m; 
          $g = $mid2; 
          $b = $v; 
          break; 
        case 4: 
          $r = $mid1; 
          $g = $m; 
          $b = $v; 
          break; 
        case 5: 
          $r = $v; 
          $g = $m; 
          $b = $mid2; 
          break; 
       } 
     } 
     return array('r' => $r * 255.0, 'g' => $g * 255.0, 'b' => $b * 255.0); 
} 
+0

मिला [इस उत्तर] (http://stackoverflow.com/a/34363975/3437608) इस फ़ंक्शन के विपरीत, और अतिरिक्त क्षमताओं के लिए देखें। – Cullub

1

ColorJizz आप/से कई प्रारूपों कन्वर्ट करने के लिए अनुमति देता है। एक PHP संस्करण भी है।