/// <summary> /// Adapts a <see cref="LinearRgb"/> color from the source working space to working space set in <see cref="TargetRgbWorkingSpace"/>. /// </summary> /// <param name="color">The color to adapt</param> /// <returns>The adapted color</returns> public LinearRgb Adapt(LinearRgb color) { Guard.NotNull(color, nameof(color)); if (!this.IsChromaticAdaptationPerformed) { throw new InvalidOperationException("Cannot perform chromatic adaptation, provide a chromatic adaptation method and white point."); } if (color.WorkingSpace.Equals(this.TargetRgbWorkingSpace)) { return(color); } // Conversion to XYZ LinearRgbToCieXyzConverter converterToXYZ = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace); CieXyz unadapted = converterToXYZ.Convert(color); // Adaptation CieXyz adapted = this.ChromaticAdaptation.Transform(unadapted, color.WorkingSpace.WhitePoint, this.TargetRgbWorkingSpace.WhitePoint); // Conversion back to RGB CieXyzToLinearRgbConverter converterToRGB = this.GetCieXyxToLinearRgbConverter(this.TargetRgbWorkingSpace); return(converterToRGB.Convert(adapted)); }
/// <summary> /// Gets the correct converter for the given rgb working space. /// </summary> /// <param name="workingSpace">The target working space</param> /// <returns>The <see cref="CieXyzToLinearRgbConverter"/></returns> private CieXyzToLinearRgbConverter GetCieXyxToLinearRgbConverter(IRgbWorkingSpace workingSpace) { if (this.cieXyzToLinearRgbConverter != null && this.cieXyzToLinearRgbConverter.TargetWorkingSpace.Equals(workingSpace)) { return(this.cieXyzToLinearRgbConverter); } return(this.cieXyzToLinearRgbConverter = new CieXyzToLinearRgbConverter(workingSpace)); }
/// <summary> /// Converts a <see cref="CieXyz"/> into a <see cref="LinearRgb"/> /// </summary> /// <param name="color">The color to convert.</param> /// <returns>The <see cref="LinearRgb"/></returns> public LinearRgb ToLinearRgb(CieXyz color) { Guard.NotNull(color, nameof(color)); // Adaptation CieXyz adapted = this.TargetRgbWorkingSpace.WhitePoint.Equals(this.WhitePoint) || !this.IsChromaticAdaptationPerformed ? color : this.ChromaticAdaptation.Transform(color, this.WhitePoint, this.TargetRgbWorkingSpace.WhitePoint); // Conversion CieXyzToLinearRgbConverter xyzConverter = this.GetCieXyxToLinearRgbConverter(this.TargetRgbWorkingSpace); return(xyzConverter.Convert(adapted)); }