Convert wavelength in nm to RGB

Maybe some day you'll need to convert wavelengthes in nanometers to RGB values.
I just needed it for visualizing emission values of flourescent dyes in a lab information system.
I didn't want to make that by hand, picking e.g. 20 values from the color range to let them stand for everything between them, but wanted to have a proper and (at least approximately) exact solution.

The function below is based on an algorithm developed by Dan Bruton I found in the web.
I just transcribed it to PHP, and it works pretty good.


<?php
function wavtorgb($w){
   $w = intval($w);
   if(!$w) return false;
	
   //color
   if($w >= 100 AND $w < 380){
      $r = 0.91;
      $g = 0.77;
      $b = 1.0;
	
   }elseif($w >= 380 AND $w < 440){
      $r = abs($w - 440) / (440 - 350);
      $g = 0.0;
      $b = 1.0;
	
   }elseif($w >= 440 AND $w < 490){
      $r = 0.0;
      $g = abs($w - 440) / (490 - 440);
      $b = 1.0;
	
   }elseif($w >= 490 AND $w < 510){
      $r = 0.0;
      $g = 1.0;
      $b = abs($w - 510) / (510 - 490);
	
   }elseif($w >= 510 AND $w < 580){
      $r = abs($w - 510) / (580 - 510);
      $g = 1.0;
      $b = 0.0;
	
   }elseif($w >= 580 AND $w < 645){
      $r = 1.0;
      $g = abs($w - 645) / (645 - 580);
      $b = 0.0;
	
   }elseif($w >= 645 AND $w < 780){
      $r = 1.0;
      $g = 0.0;
      $g = 0.0;
		
   }elseif($w >= 780 AND $w < 1000000){
      $r = 1.0;
      $g = 0.31;
      $b = 0.31;
	
   }else{
      $r = 0.0;
      $g = 0.0;
      $b = 0.0;
   }
	
   //let the intensity sss fall off near the vision limits
   if($w >= 380 AND $w < 420){
      $sss = 0.3 + 0.7*($w - 350) / (420 - 350);
	
   }elseif($w >= 420 AND $w <= 700){
      $sss = 1.0;
	
   }elseif($w > 700 AND $w <= 780){
      $sss = 0.3 + 0.7*(780 - $w) / (780 - 700);
	
   }else{
      $sss = 1.0;
   }
   $sss *= 255;
	
   $r = intval($sss * $r);
   $g = intval($sss * $g);
   $b = intval($sss * $b);
	
	
   //label
   if($w >= 100 AND $w < 380){
      $label = $w."nm (UV)";

   }elseif($w >= 380 AND $w < 780){
      $label = $w."nm";

   }elseif($w >= 780 AND $w < 1000000){
      $label = $w."nm (IR)";

   }else{
      return false;
   }
	
   $return = array($r, $g, $b, $label);
   return $return;
}
?>
Angular-Buch