Exemple #1
0
        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;
        }
Exemple #2
0
        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);
            }
        }