def xy2rgb(cls, value): rgb = None if isinstance(value, (list, tuple)): if len(value) == 3: rgb = value elif len(value) == 2: xy = xyYColor(*value, 0) srgb = convert_color(xy, sRGBColor) rgb = srgb.get_upscaled_value_tuple() return rgb
def XYZ_to_xyY(cobj, *args, **kwargs): """ Convert from XYZ to xyY. """ xyy_x = cobj.xyz_x / (cobj.xyz_x + cobj.xyz_y + cobj.xyz_z) xyy_y = cobj.xyz_y / (cobj.xyz_x + cobj.xyz_y + cobj.xyz_z) xyy_Y = cobj.xyz_y return xyYColor( xyy_x, xyy_y, xyy_Y, observer=cobj.observer, illuminant=cobj.illuminant)
def XYZ_to_xyY(cobj, *args, **kwargs): """ Convert from XYZ to xyY. """ xyz_sum = cobj.xyz_x + cobj.xyz_y + cobj.xyz_z # avoid division by zero if xyz_sum == 0.0: xyy_x = 0.0 xyy_y = 0.0 else: xyy_x = cobj.xyz_x / xyz_sum xyy_y = cobj.xyz_y / xyz_sum xyy_Y = cobj.xyz_y return xyYColor( xyy_x, xyy_y, xyy_Y, observer=cobj.observer, illuminant=cobj.illuminant)
def __init__(self, ketra, name, area, output_type, xy_chroma, level, load_type, uid): """Initializes the Output.""" super(Output, self).__init__(ketra, name, area, uid) self._output_type = output_type self._load_type = load_type self._level = level self._xy = xy_chroma xyY = xyYColor(xy_chroma[0], xy_chroma[1], 1) rgb = convert_color(xyY, sRGBColor) self._rgb = [rgb.rgb_r, rgb.rgb_g, rgb.rgb_b] hs = convert_color(xyY, HSVColor) self._hs = [hs.hsv_h, hs.hsv_s] self._cct = None self._xy_chroma = None self._query_waiters = _RequestHelper() self._ketra.register_id(Output.CMD_TYPE, self)
def _temp_to_white(t): """Convert color temperature to sRGB white point tuple.""" # Use equation from: # http://en.wikipedia.org/wiki/Planckian_locus#Approximation xc = 0.0 if 1667.0 <= t and t <= 4000.0: xc = -0.2661239*(math.pow(10.0, 9.0)/math.pow(t, 3.0)) - 0.2343580*(math.pow(10.0, 6.0)/math.pow(t, 2.0)) + 0.8776956*(math.pow(10.0, 3.0)/float(t)) + 0.179910 elif 4000 < t and t <= 25000.0: xc = -3.0258469*(math.pow(10.0, 9.0)/math.pow(t, 3.0)) + 2.1070379*(math.pow(10.0, 6.0)/math.pow(t, 2.0)) + 0.2226347*(math.pow(10.0, 3.0)/float(t)) + 0.240390 else: raise ValueError('Temperature must be between 1667K and 25000K.') yc = 0.0 if 1667.0 <= t and t <= 2222.0: yc = -1.1063814*math.pow(xc, 3.0) - 1.34811020*math.pow(xc, 2.0) + 2.18555832*xc - 0.20219683 elif 2222.0 < t and t <= 4000.0: yc = -0.9549476*math.pow(xc, 3.0) - 1.37418593*math.pow(xc, 2.0) + 2.09137015*xc - 0.16748867 elif 4000.0 < t and t <= 25000.0: yc = 3.0817580*math.pow(xc, 3.0) - 5.87338670*math.pow(xc, 2.0) + 3.75112997*xc - 0.37001483 # Covert from full bright xyY color space to RGB (sRGB default) for white point at specified temp. white = xyYColor(xc, yc, 1.0).convert_to('rgb').get_value_tuple() # Return values normalized to 0-1.0 range. return (white[0] / 255.0, white[1] / 255.0, white[2] / 255.0)
def convertcolorxyYtoRGB(self, _xycolor, brightness): [_x, _y] = _xycolor _Y = brightness _xyY = xyYColor(_x, _y, _Y) _rgb = convert_color(_xyY, sRGBColor, target_illuminant='d50') maxrgb = max(_rgb.rgb_r, _rgb.rgb_g, _rgb.rgb_b) if maxrgb > 1: _r = _rgb.rgb_r / maxrgb _g = _rgb.rgb_g / maxrgb _b = _rgb.rgb_b / maxrgb else: _r = _rgb.rgb_r _g = _rgb.rgb_g _b = _rgb.rgb_b _r = int(round(_r * 255, 0)) _g = int(round(_g * 255, 0)) _b = int(round(_b * 255, 0)) if _r < 0: _r = _r + 255 if _g < 0: _g = _g + 255 if _b < 0: _b = _b + 255 return (_r, _g, _b)
ill = "d65" fmtstrttl = 5 * "{:12s} " + "\n" fmtstr = 5 * "{:12.10f} " + "\n" with open("PaV.dat", "w") as fileout: fileout.write( fmtstrttl.format( "x", "y", "r", "g", "b" ) ) for x in drange(xmin, xmax, valinc): for y in drange(ymin, ymax, valinc): xyY = xyYColor(x, y, Y, observer=obs, illuminant=ill) rgb = convert_color(xyY, sRGBColor) rgb_clamped = sRGBColor( rgb.clamped_rgb_r, rgb.clamped_rgb_g, rgb.clamped_rgb_b ) r, g, b = rgb_clamped.get_value_tuple() fileout.write( fmtstr.format( x, y, r, g, b, ) )
def toLab(x, y, Y): color = convert_color(xyYColor(x, y, Y, illuminant='C'), XYZColor) color.apply_adaptation('D65') return convert_color(color, LabColor)
def test_conversion_to_xyy(self): xyy = convert_color(self.color, xyYColor) self.assertColorMatch(xyy, xyYColor(0.167, 0.333, 0.200))
def setUp(self): self.color = xyYColor(0.167, 0.333, 0.200)