public DNGColorSpec(double[] colorMatrix1, double[] colorMatrix2, IFDDNGCalibrationIlluminant.Illuminant illuminant1, IFDDNGCalibrationIlluminant.Illuminant illuminant2, float[] whiteBalance) { fChannels = 3; fTemperature1 = ConvertIlluminantToTemperature(illuminant1); fTemperature2 = ConvertIlluminantToTemperature(illuminant2); if (colorMatrix1 == null) { fColorMatrix1 = DNGMatrix.Identity(fChannels); //best choice if nothing is given... } else { fColorMatrix1 = new DNGMatrix3x3(colorMatrix1); } if (colorMatrix2 == null) { fColorMatrix2 = new DNGMatrix(); } else { fColorMatrix2 = new DNGMatrix3x3(colorMatrix2); } fForwardMatrix1 = new DNGMatrix(); fForwardMatrix2 = new DNGMatrix(); fReductionMatrix1 = new DNGMatrix(); fReductionMatrix2 = new DNGMatrix(); fCameraCalibration1 = DNGMatrix.Identity(fChannels); fCameraCalibration2 = DNGMatrix.Identity(fChannels); fAnalogBalance = DNGMatrix.Identity(fChannels); fForwardMatrix1 = NormalizeForwardMatrix(fForwardMatrix1); fColorMatrix1 = fAnalogBalance * fCameraCalibration1 * fColorMatrix1; if (fColorMatrix2.IsEmpty() || fTemperature1 <= 0.0 || fTemperature2 <= 0.0 || fTemperature1 == fTemperature2) { fTemperature1 = 5000.0; fTemperature2 = 5000.0; fColorMatrix2 = fColorMatrix1; fForwardMatrix2 = fForwardMatrix1; fReductionMatrix2 = fReductionMatrix1; fCameraCalibration2 = fCameraCalibration1; } else { fForwardMatrix2 = NormalizeForwardMatrix(fForwardMatrix2); fColorMatrix2 = fAnalogBalance * fCameraCalibration2 * fColorMatrix2; // Swap values if temperatures are out of order. if (fTemperature1 > fTemperature2) { double temp = fTemperature1; fTemperature1 = fTemperature2; fTemperature2 = temp; DNGMatrix T = fColorMatrix1; fColorMatrix1 = fColorMatrix2; fColorMatrix2 = T; T = fForwardMatrix1; fForwardMatrix1 = fForwardMatrix2; fForwardMatrix2 = T; T = fReductionMatrix1; fReductionMatrix1 = fReductionMatrix2; fReductionMatrix2 = T; T = fCameraCalibration1; fCameraCalibration1 = fCameraCalibration2; fCameraCalibration2 = T; } } DNGxyCoord white; DNGVector vec = new DNGVector((uint)whiteBalance.Length); for (uint c = 0; c < whiteBalance.Length; c++) { //white point is given as a multiplicatice factor //actual white point is hence 1/value vec[c] = 1.0f / whiteBalance[c]; } double unify = 1.0 / vec.MaxEntry(); vec = unify * vec; white = NeutralToXY(vec); WhiteXY = white; }
private double ConvertIlluminantToTemperature(IFDDNGCalibrationIlluminant.Illuminant illuminant) { switch (illuminant) { case IFDDNGCalibrationIlluminant.Illuminant.Unknown: return(0.0); case IFDDNGCalibrationIlluminant.Illuminant.Daylight: return(5500.0); case IFDDNGCalibrationIlluminant.Illuminant.Fluorescent: return((3800.0 + 4500.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.Tungsten: return(2850.0); case IFDDNGCalibrationIlluminant.Illuminant.Flash: return(5500.0); case IFDDNGCalibrationIlluminant.Illuminant.FineWeather: return(5500.0); case IFDDNGCalibrationIlluminant.Illuminant.CloudyWeather: return(6500.0); case IFDDNGCalibrationIlluminant.Illuminant.Shade: return(7500.0); case IFDDNGCalibrationIlluminant.Illuminant.DaylightFluorescent: return((5700.0 + 7100.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.DayWhiteFluorescent: return((4600.0 + 5500.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.CoolWhiteFluorescent: return((3800.0 + 4500.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.WhiteFluorescent: return((3250.0 + 3800.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.WarmWhiteFluorescent: return((2600.0 + 3250.0) * 0.5); case IFDDNGCalibrationIlluminant.Illuminant.StandardLightA: return(2850.0); case IFDDNGCalibrationIlluminant.Illuminant.StandardLightB: return(5500.0); case IFDDNGCalibrationIlluminant.Illuminant.StandardLightC: return(6500.0); case IFDDNGCalibrationIlluminant.Illuminant.D55: return(5500.0); case IFDDNGCalibrationIlluminant.Illuminant.D65: return(6500.0); case IFDDNGCalibrationIlluminant.Illuminant.D75: return(7500.0); case IFDDNGCalibrationIlluminant.Illuminant.D50: return(5000.0); case IFDDNGCalibrationIlluminant.Illuminant.ISOStudioTungsten: return(3200.0); case IFDDNGCalibrationIlluminant.Illuminant.OtherLightSource: return(0.0); default: return(0.0); } }