Color RGB/HSL/HEX converter

By Degausser on Aug 01, 2017

A few functions to handle conversion between different types

$rgbtohex(N N N)
$rgbtohsl(N N N) .decimal
$hextorgb(N) .comma .single
$hextohsl(N) .decimal
$hsltorgb(N N N, [decimal]) .comma .single
$hsltohex(N N N, [decimal])

parameters dictate input, properties output:

decimal - signifies decimal format, rather than a percentage or degree with HSL input / output
single - returns single number representation of RGB values
comma - returns comma separated RGB values

spaces or commas can be used synonymously in the function call. Examples:

$rgbtohex(44 128 201) returns: #2C80C9
$rgbtohex(44,128,201) returns: #2C80C9
$rgbtohex(13205548) returns: #2C80C9

$hextorgb(#2C80C9) returns: 44 128 201
$hextorgb(2C80C9).decimal returns: 44,128,201
$hextorgb(2C80C9).single returns: 13205548

$rgbtohsl(44 128 201) returns: 207.9 64.1 48
$rgbtohsl(13205548) returns: 207.9 64.1 48
$rgbtohsl(44,128,201).decimal returns: 0.578 0.641 0.48

$hsltorgb(207.9 64.1 48) returns 44 128 201
$hsltorgb(207.9,64.1,48).comma returns 44,128,201
$hsltorgb(207.9,64.1,48).single returns 13205548
$hsltorgb(207.9 64.1 48).single returns 13205548
$hsltorgb(0.578 0.641 0.48 decimal) returns 44 128 201
$hsltorgb(0.578 0.641 0.48, decimal).single returns 13205548

$hextohsl(#2C80C9) returns: 207.9 64.1 48
$hextohsl(2C80C9).decimal returns: 0.578 0.641 0.48

$hsltohex(207.9 64.1 48) returns #2C80C9
$hsltohex(0.578 0.641 0.48 decimal) returns #2C80C9

HSL is a user friendly cylandrical reference of color. It can be used along with DCX / Picture windows to create something like this:

Image

For the record, i've stumbled across a bug in DCX which resizes the windows within mIRC once the DCX marked dialog containing picture windows is closed. I've somewhat resolved this by using sendkeys.dll, with the alt+x command when the dialog has closed.

rgbtohex {
  tokenize 44 $replace($1-3,$chr(32),$chr(44))
  if (!$2) tokenize 44 $rgb($1)
  return $+($chr(35),$base($1,10,16,2),$base($2,10,16,2),$base($3,10,16,2))
}

rgbtohsl {
  tokenize 44 $replace($1-3,$chr(32),$chr(44))
  if (!$2) tokenize 44 $rgb($1)
  var %r = $calc($1 / 255), %g = $calc($2 / 255), %b = $calc($3 / 255), %s = 0, %h = 0, %d
  var %sort = $sorttok(%r %g %b,32,n), %min = $gettok(%sort,1,32), %max = $gettok(%sort,3,32), %l = $calc((%max + %min) / 2)
  if (%min == %max) return 0 0 $iif($prop == decimal,$round(%l,3),$round($calc(%l * 100),1))
  %d = $calc(%max - %min)
  if (%max == %r) %h = $calc((%g - %b) / %d)
  elseif (%max == %g) %h = $calc(2 + ((%b - %r) / %d))
  else %h = $calc(4 + ((%r - %g) / %d))
  %h = $round($calc(%h * 60),1)
  if (%h < 0) inc %h 360
  %s = $iif(%l > 0.5,$calc(%d / (2 - %max - %min)),$calc(%d / (%max + %min)))
  if ($prop == decimal) return $round($calc((%h / 360)),3) $round(%s,3) $round(%l,3)
  return %h $round($calc(%s * 100),1) $round($calc(%l * 100),1)
}

hextorgb {
  var %h = $remove($1-,$chr(35)), %r = $rgb($base($mid(%h,1,2),16,10),$base($mid(%h,3,2),16,10),$base($mid(%h,5,2),16,10))
  if ($prop == single) return %r
  return $iif($prop != comma,$replace($rgb(%r),$chr(44),$chr(32)),$rgb(%r))
}

hextohsl {
  var %r = $hextorgb($1)
  return $iif($prop == decimal,$rgbtohsl(%r).decimal,$rgbtohsl(%r))
}

hsltorgb {
  tokenize 32 $replace($1-,$chr(44),$chr(32))
  if ($4 != decimal) tokenize 32 $calc($1 / 360) $calc($2 / 100) $calc($3 / 100)
  if ($2 == 0) var %r = $round($calc($3 * 255),0), %g = %r, %b = %r
  else {
    var %h = $1, %s = $2, %l = $3, %q, %p
    %q = $iif(%l < 0.5,$calc(%l * (1 + %s)),$calc((%l + %s) - (%l * %s)))
    %p = $calc((2 * %l) - %q)
    %r = $hue2rgb(%q, %p, $calc(%h + 1/3))
    %g = $hue2rgb(%q, %p, %h)
    %b = $hue2rgb(%q, %p, $calc(%h - 1/3))
    %r = $round($calc(%r * 255),0)
    %g = $round($calc(%g * 255),0)
    %b = $round($calc(%b * 255),0)
  }
  if ($prop == single) return $rgb(%r,%g,%b)
  return $iif($prop == comma,$+(%r,$chr(44),%g,$chr(44),%b),%r %g %b)
}

hsltohex {
  var %r = $hsltorgb($1-)
  return $rgbtohex(%r)
}

hue2rgb {
  var %t = $3
  if (%t < 0) inc %t
  if (%t > 1) dec %t
  if ($calc(6 * %t) < 1) return $calc($2 + (($1 - $2) * 6 * %t))
  if (%t < 0.5) return $1
  if ($calc(%t * 3) < 2) return $calc($2 + (($1 - $2) * 6 * (2/3 - %t)))
  return $2
}

Comments

Sign in to comment.
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.