用Flash MX 2004自制调色版和配色组件(二)

王咏刚,2005年4月

在这种使用了HSB色环的调色版组件中,最重要的基本函数是HSB和RGB色彩空间的相互转换。网上好像有很多人在找类似的代码,实际上,Java API中的Color类就包含这样的函数,而Java SDK又提供了源代码,我们可以直接把Java代码改为Flash用的JavaScript代码。下面是我的修改结果:

 public static function hsb2rgb(hue:Number, saturation:Number, brightness:Number):Number {
  var r, g, b, h, f, p, q, t;
  var rgbvals = new Array(3);
  hue /= 360; saturation /= 100; brightness /= 100;
  if (saturation == 0) {
   r = g = b = Math.floor(brightness * 255.0 + 0.5);
  } else {
   h = (hue - Math.floor(hue)) * 6.0;
   f = h - Math.floor(h);
   p = brightness * (1.0 - saturation);
   q = brightness * (1.0 - saturation * f);
   t = brightness * (1.0 - (saturation * (1.0 - f)));
   switch (Math.floor(h)) {
   case 0:
    r = Math.floor(brightness * 255.0 + 0.5);
    g = Math.floor(t * 255.0 + 0.5);
    b = Math.floor(p * 255.0 + 0.5);
    break;
   case 1:
    r = Math.floor(q * 255.0 + 0.5);
    g = Math.floor(brightness * 255.0 + 0.5);
    b = Math.floor(p * 255.0 + 0.5);
    break;
   case 2:
    r = Math.floor(p * 255.0 + 0.5);
    g = Math.floor(brightness * 255.0 + 0.5);
    b = Math.floor(t * 255.0 + 0.5);
    break;
   case 3:
    r = Math.floor(p * 255.0 + 0.5);
    g = Math.floor(q * 255.0 + 0.5);
    b = Math.floor(brightness * 255.0 + 0.5);
    break;
   case 4:
    r = Math.floor(t * 255.0 + 0.5);
    g = Math.floor(p * 255.0 + 0.5);
    b = Math.floor(brightness * 255.0 + 0.5);
    break;
   case 5:
    r = Math.floor(brightness * 255.0 + 0.5);
    g = Math.floor(p * 255.0 + 0.5);
    b = Math.floor(q * 255.0 + 0.5);
    break;
   }
  }
  rgbvals[0] = r;
  rgbvals[1] = g;
  rgbvals[2] = b;
  return rgbvals; 
 }
 
 public static function hsb2rgbValue(hue:Number, saturation:Number, brightness:Number):Number {
  var rgbvals = hsb2rgb(hue, saturation, brightness);
  return (rgbvals[0] << 16) | (rgbvals[1] << 8) | (rgbvals[2] << 0);
 }
 
 public static function rgb2hsb(r:Number, g:Number, b:Number):Array {
  var hue, saturation, brightness;
  var hsbvals = new Array(3);
  var cmax = (r > g) ? r : g;
  if (b > cmax) cmax = b;
  var cmin = (r < g) ? r : g;
  if (b < cmin) cmin = b;
 
  brightness = cmax / 255.0;
  if (cmax != 0)
   saturation = (cmax - cmin) / cmax;
  else
   saturation = 0;
  if (saturation == 0)
   hue = 0;
  else {
   var redc = (cmax - r) / (cmax - cmin);
   var greenc = (cmax - g) / (cmax - cmin);
   var bluec = (cmax - b) / (cmax - cmin);
   if (r == cmax)
   hue = bluec - greenc;
   else if (g == cmax)
    hue = 2.0 + redc - bluec;
    else
   hue = 4.0 + greenc - redc;
   hue = hue / 6.0;
   if (hue < 0)
   hue = hue + 1.0;
  }
  hsbvals[0] = Math.floor(hue * 360 + 0.5);
  hsbvals[1] = Math.floor(saturation * 100 + 0.5);
  hsbvals[2] = Math.floor(brightness * 100 + 0.5);
  return hsbvals;
 }
 
 public static function rgbValue2hsb(rgb:Number):Array {
  var r = rgb >> 16;
  var g = (rgb - (r << 16)) >> 8;
  var b = rgb - (r << 16) - (g << 8);
  return rgb2hsb(r, g, b);
 }

……未完待续……

原文地址:https://www.cnblogs.com/xiaomaohai/p/6157227.html