示例#1
0
        private void ApplyWhiteBalance(IMagickImage image)
        {
            using (var mask = image.Clone())
            {
                mask.ColorSpace = ColorSpace.HSB;
                mask.Negate(Channels.Green);

                using (var newMask = mask.Separate(Channels.Green).First())
                {
                    using (var maskBlue = mask.Separate(Channels.Blue).First())
                    {
                        newMask.Composite(maskBlue, CompositeOperator.Multiply);
                    }

                    newMask.ContrastStretch((Percentage)0, WhiteBalance);
                    newMask.InverseOpaque(new MagickColor("white"), new MagickColor("black"));

                    double maskMean = GetMean(newMask);

                    double redRatio   = GetRatio(image, Channels.Red, newMask, maskMean);
                    double greenRatio = GetRatio(image, Channels.Green, newMask, maskMean);
                    double blueRatio  = GetRatio(image, Channels.Blue, newMask, maskMean);

                    var matrix = new MagickColorMatrix(3, redRatio, 0, 0, 0, greenRatio, 0, 0, 0, blueRatio);

                    image.ColorMatrix(matrix);
                }
            }
        }