• Jump To … +
    analyze.coffee autoload.coffee blender.coffee calculate.coffee caman.coffee convert.coffee event.coffee filter.coffee io.coffee layer.coffee logger.coffee pixelinfo.coffee plugin.coffee renderer.coffee store.coffee util.coffee blenders.coffee filters.coffee size.coffee blur.coffee camera.coffee compoundBlur.coffee edges.coffee posterize.coffee presets.coffee stackBlur.coffee threshold.coffee
  • convert.coffee

  • ¶

    Tons of color conversion functions

    class Convert
  • ¶

    Converts the hex representation of a color to RGB values. Hex value can optionally start with the hash (#).

    @param   String  hex   The colors hex value
    @return  Array         The RGB representation
    
      @hexToRGB: (hex) ->
        hex = hex.substr(1) if hex.charAt(0) is "#"
        r = parseInt hex.substr(0, 2), 16
        g = parseInt hex.substr(2, 2), 16
        b = parseInt hex.substr(4, 2), 16
    
        r: r, g: g, b: b
  • ¶

    Converts an RGB color to HSL. Assumes r, g, and b are in the set [0, 255] and returns h, s, and l in the set [0, 1].

    @param   Number  r   Red channel
    @param   Number  g   Green channel
    @param   Number  b   Blue channel
    @return              The HSL representation
    
      @rgbToHSL: (r, g, b) ->
        if typeof r is "object"
          g = r.g
          b = r.b
          r = r.r
    
        r /= 255
        g /= 255
        b /= 255
    
        max = Math.max r, g, b
        min = Math.min r, g, b
        l = (max + min) / 2
    
        if max is min
          h = s = 0
        else
          d = max - min
          s = if l > 0.5 then d / (2 - max - min) else d / (max + min)
          h = switch max
            when r then (g - b) / d + (if g < b then 6 else 0)
            when g then (b - r) / d + 2
            when b then (r - g) / d + 4
          
          h /= 6
    
        h: h, s: s, l: l
  • ¶

    Converts an HSL color value to RGB. Conversion formula adapted from http://en.wikipedia.org/wiki/HSL_color_space. Assumes h, s, and l are contained in the set [0, 1] and returns r, g, and b in the set [0, 255].

    @param   Number  h       The hue
    @param   Number  s       The saturation
    @param   Number  l       The lightness
    @return  Array           The RGB representation
    
      @hslToRGB: (h, s, l) ->
        if typeof h is "object"
          s = h.s
          l = h.l
          h = h.h
    
        if s is 0
          r = g = b = l
        else
          q = if l < 0.5 then l * (1 + s) else l + s - l * s
          p = 2 * l - q
          
          r = @hueToRGB p, q, h + 1/3
          g = @hueToRGB p, q, h
          b = @hueToRGB p, q, h - 1/3
    
        r: r * 255, g: g * 255, b: b * 255
  • ¶

    Converts from the hue color space back to RGB

      @hueToRGB: (p, q, t) ->
        if t < 0 then t += 1
        if t > 1 then t -= 1
        if t < 1/6 then return p + (q - p) * 6 * t
        if t < 1/2 then return q
        if t < 2/3 then return p + (q - p) * (2/3 - t) * 6
        return p
  • ¶

    Converts an RGB color value to HSV. Conversion formula adapted from http://en.wikipedia.org/wiki/HSV_color_space. Assumes r, g, and b are contained in the set [0, 255] and returns h, s, and v in the set [0, 1].

    @param   Number  r       The red color value
    @param   Number  g       The green color value
    @param   Number  b       The blue color value
    @return  Array           The HSV representation
    
      @rgbToHSV: (r, g, b) ->
        r /= 255
        g /= 255
        b /= 255
    
        max = Math.max r, g, b
        min = Math.min r, g, b
        v = max
        d = max - min
    
        s = if max is 0 then 0 else d / max
    
        if max is min
          h = 0
        else
          h = switch max
            when r then (g - b) / d + (if g < b then 6 else 0)
            when g then (b - r) / d + 2
            when b then (r - g) / d + 4
    
          h /= 6
    
        h: h, s: s, v: v
  • ¶

    Converts an HSV color value to RGB. Conversion formula adapted from http://en.wikipedia.org/wiki/HSV_color_space. Assumes h, s, and v are contained in the set [0, 1] and returns r, g, and b in the set [0, 255].

    @param   Number  h       The hue
    @param   Number  s       The saturation
    @param   Number  v       The value
    @return  Array           The RGB representation
    
      @hsvToRGB: (h, s, v) ->
        i = Math.floor h * 6
        f = h * 6 - i
        p = v * (1 - s)
        q = v * (1 - f * s)
        t = v * (1 - (1 - f) * s)
    
        switch i % 6
          when 0
            r = v
            g = t
            b = p
          when 1
            r = q
            g = v
            b = p
          when 2
            r = p
            g = v
            b = t
          when 3
            r = p
            g = q
            b = v
          when 4
            r = t
            g = p
            b = v
          when 5
            r = v
            g = p
            b = q
    
        r: r * 255, g: g * 255, b: b * 255
  • ¶

    Converts a RGB color value to the XYZ color space. Formulas are based on http://en.wikipedia.org/wiki/SRGB assuming that RGB values are sRGB.

    Assumes r, g, and b are contained in the set [0, 255] and returns x, y, and z.

    @param   Number  r       The red color value
    @param   Number  g       The green color value
    @param   Number  b       The blue color value
    @return  Array           The XYZ representation
    
      @rgbToXYZ: (r, g, b) ->
        r /= 255
        g /= 255
        b /= 255
    
        if r > 0.04045
          r = Math.pow((r + 0.055) / 1.055, 2.4)
        else
          r /= 12.92
    
        if g > 0.04045
          g = Math.pow((g + 0.055) / 1.055, 2.4)
        else
          g /= 12.92
    
        if b > 0.04045
          b = Math.pow((b + 0.055) / 1.055, 2.4)
        else
          b /= 12.92
    
        x = r * 0.4124 + g * 0.3576 + b * 0.1805;
        y = r * 0.2126 + g * 0.7152 + b * 0.0722;
        z = r * 0.0193 + g * 0.1192 + b * 0.9505;
      
        x: x * 100, y: y * 100, z: z * 100
  • ¶

    Converts a XYZ color value to the sRGB color space. Formulas are based on http://en.wikipedia.org/wiki/SRGB and the resulting RGB value will be in the sRGB color space. Assumes x, y and z values are whatever they are and returns r, g and b in the set [0, 255].

    @param   Number  x       The X value
    @param   Number  y       The Y value
    @param   Number  z       The Z value
    @return  Array           The RGB representation
    
      @xyzToRGB: (x, y, z) ->
        x /= 100
        y /= 100
        z /= 100
    
        r = (3.2406  * x) + (-1.5372 * y) + (-0.4986 * z)
        g = (-0.9689 * x) + (1.8758  * y) + (0.0415  * z)
        b = (0.0557  * x) + (-0.2040 * y) + (1.0570  * z)
    
        if r > 0.0031308
          r = (1.055 * Math.pow(r, 0.4166666667)) - 0.055
        else
          r *= 12.92
    
        if g > 0.0031308
          g = (1.055 * Math.pow(g, 0.4166666667)) - 0.055
        else
          g *= 12.92
    
        if b > 0.0031308
          b = (1.055 * Math.pow(b, 0.4166666667)) - 0.055
        else
          b *= 12.92
    
        r: r * 255, g: g * 255, b: b * 255
  • ¶

    Converts a XYZ color value to the CIELAB color space. Formulas are based on http://en.wikipedia.org/wiki/Lab_color_space The reference white point used in the conversion is D65. Assumes x, y and z values are whatever they are and returns L, a and b* values

    @param   Number  x       The X value
    @param   Number  y       The Y value
    @param   Number  z       The Z value
    @return  Array           The Lab representation
    
      @xyzToLab: (x, y, z) ->
        if typeof x is "object"
          y = x.y
          z = x.z
          x = x.x
    
        whiteX = 95.047
        whiteY = 100.0
        whiteZ = 108.883
    
        x /= whiteX
        y /= whiteY
        z /= whiteZ
    
        if x > 0.008856451679
          x = Math.pow(x, 0.3333333333)
        else
          x = (7.787037037 * x) + 0.1379310345
      
        if y > 0.008856451679
          y = Math.pow(y, 0.3333333333)
        else
          y = (7.787037037 * y) + 0.1379310345
      
        if z > 0.008856451679
          z = Math.pow(z, 0.3333333333)
        else
          z = (7.787037037 * z) + 0.1379310345
    
        l = 116 * y - 16
        a = 500 * (x - y)
        b = 200 * (y - z)
    
        l: l, a: a, b: b
  • ¶

    Converts a L, a, b* color values from the CIELAB color space to the XYZ color space. Formulas are based on http://en.wikipedia.org/wiki/Lab_color_space

    The reference white point used in the conversion is D65. Assumes L, a and b* values are whatever they are and returns x, y and z values.

    @param   Number  l       The L* value
    @param   Number  a       The a* value
    @param   Number  b       The b* value
    @return  Array           The XYZ representation
    
      @labToXYZ: (l, a, b) ->
        if typeof l is "object"
          a = l.a
          b = l.b
          l = l.l
    
        y = (l + 16) / 116
        x = y + (a / 500)
        z = y - (b / 200)
    
        if x > 0.2068965517
          x = x * x * x
        else
          x = 0.1284185493 * (x - 0.1379310345)
      
        if y > 0.2068965517
          y = y * y * y
        else
          y = 0.1284185493 * (y - 0.1379310345)
      
        if z > 0.2068965517
          z = z * z * z
        else
          z = 0.1284185493 * (z - 0.1379310345)
  • ¶

    D65 reference white point

        x: x * 95.047, y: y * 100.0, z: z * 108.883
    
      @rgbToLab: (r, g, b) ->
        if typeof r is "object"
          g = r.g
          b = r.b
          r = r.r
        
        xyz = @rgbToXYZ(r, g, b)
        @xyzToLab xyz
    
      @labToRGB: (l, a, b) ->