/// <summary> /// Convert an XYZ color to xyY and RGB, using a color matrix and a power-law gamma function. /// </summary> /// <param name="XYZ">XYZ color to convert</param> /// <param name="inverse">XYZ to RGB color matrix</param> /// <param name="gamma">Gamma exponent</param> /// <param name="rgb">Variable to store RGB result</param> /// <param name="xyY">Variable to store xyY result</param> public static void fromXYZ(ColorVector XYZ, ColorMatrix inverse, double gamma, out ColorVector rgb, out ColorVector xyY) { xyY = XYZtoxyY(XYZ); ColorVector gammafied = inverse.Multiply(XYZ); gammafied.MaxLocal(0.0); rgb = gammafied.Power(1.0 / gamma); }
/// <summary> /// Convert an xyY color to XYZ and RGB, using a color matrix and a power-law gamma function. /// </summary> /// <param name="xyY">xyY color to convert</param> /// <param name="inverse">XYZ to RGB color matrix</param> /// <param name="gamma">Gamma exponent</param> /// <param name="rgb">Variable to store RGB result</param> /// <param name="XYZ">Variable to store XYZ result</param> public static void fromxyY(ColorVector xyY, ColorMatrix inverse, double gamma, out ColorVector rgb, out ColorVector XYZ) { XYZ = xyYtoXYZ(xyY); ColorVector gammafied = inverse.Multiply(XYZ); gammafied.MaxLocal(0.0); rgb = gammafied.Power(1.0 / gamma); }
/// <summary> /// <para>Convert a hue,luminance,saturation value to RGB, xyY and XYZ, using a color matrix (and its inverse) and a power-law gamma function.</para> /// <para>Steps taken by this function:</para> /// <list type="number"> /// <item>Hue (RGB) color is multiplied by the luminance.</item> /// <item>Power-law gamma function applied (color^gamma).</item> /// <item>Color is converted from RGB to XYZ using the matrix.</item> /// <item>XYZ is converted to xyY.</item> /// <item>Saturation is applied to the xyY color, moving it a certain percentage to the xyY white point defined by the matrix. This value is stored in the xyY out variable.</item> /// <item>The saturated xyY is converted back to XYZ, and stored in the XYZ out variable.</item> /// <item>The saturated XYZ is converted back to RGB using the inverse matrix.</item> /// <item>The RGB color is gamma corrected using the inverse gamma (color^(1/gamma)). This value is stored in the rgb out variable.</item> /// </list> /// </summary> /// <param name="hue">Hue (color) to convert (build-in luminance should be 1)</param> /// <param name="luminance">Luminance of the color</param> /// <param name="saturation">Saturation to apply</param> /// <param name="matrix">RGB to XYZ color matrix</param> /// <param name="inverse">XYZ to RGB color matrix</param> /// <param name="gamma">Gamma exponent</param> /// <param name="rgb">Variable to store RGB result</param> /// <param name="xyY">Variable to store xyY result</param> /// <param name="XYZ">Variable to store XYZ result</param> public static void fromHSL(ColorVector hue, double luminance, double saturation, ColorMatrix matrix, ColorMatrix inverse, double gamma, out ColorVector rgb, out ColorVector xyY, out ColorVector XYZ) { ColorVector luminanced = hue.Multiply(luminance); ColorVector gammafied = luminanced.Power(gamma); ColorVector usXYZ = matrix.Multiply(gammafied); ColorVector usxyY = XYZtoxyY(usXYZ); xyY = SaturatexyY(usxyY, saturation, matrix); XYZ = xyYtoXYZ(xyY); ColorVector sgammafied = inverse.Multiply(XYZ); sgammafied.MaxLocal(0.0); rgb = sgammafied.Power(1.0 / gamma); }