示例#1
0
        /// <summary>
        /// Provides a configured LinearGradient that can be used in combination with a GradientImageSource to provide a mask for the LensBlurEffect.
        /// It will expect the LensBlur will be blurred with 1 kernel when the double is different from None.
        /// </summary>
        /// <param name="ellipse">The band that represents the focus area in the image. Pixels within this band won't be blurred.
        /// Areas outside of the area will be progressively more blurred as the distance from the focus band increases.</param>
        /// <param name="strength">Strength of the blur.</param>
        /// <returns>A LinearGradient that can be used in combination with a GradientImageSource to be used by LensBlur.</returns>
        public static RadialGradient GenerateGradient(FocusEllipse ellipse, KernelGenerator kernelGenerator)
        {
            if (kernelGenerator.GetKernelBands().Count == 0)
            {
                return(null);
            }

            EllipseRadius maxBlurRadius = null;

            if ((ellipse.Radius.X < minDiffBetweenStops) && (ellipse.Radius.Y < minDiffBetweenStops))
            {
                maxBlurRadius = new EllipseRadius(minDiffBetweenStops, minDiffBetweenStops);
            }
            else
            {
                double factor       = 0.9;
                bool   widthGtHight = ellipse.Radius.X > ellipse.Radius.Y;

                if (widthGtHight)
                {
                    maxBlurRadius = new EllipseRadius(factor, factor * ellipse.Radius.Y / ellipse.Radius.X);
                }
                else
                {
                    maxBlurRadius = new EllipseRadius(factor * ellipse.Radius.X / ellipse.Radius.Y, factor);
                }
            }

            var gradient = new RadialGradient(ellipse.Center, maxBlurRadius);

            SetGradientStops(gradient, ellipse, maxBlurRadius, kernelGenerator);

            return(gradient);
        }
		/// <summary>
		/// Provides a configured LinearGradient that can be used in combination with a GradientImageSource to provide a mask for the LensBlurEffect.
		/// It will expect the LensBlur will be blurred with 1 kernel when the double is different from None.
		/// </summary>
		/// <param name="ellipse">The band that represents the focus area in the image. Pixels within this band won't be blurred. 
		/// Areas outside of the area will be progressively more blurred as the distance from the focus band increases.</param>
		/// <param name="strength">Strength of the blur.</param>
		/// <returns>A LinearGradient that can be used in combination with a GradientImageSource to be used by LensBlur.</returns>
		public static RadialGradient GenerateGradient(FocusEllipse ellipse, KernelGenerator kernelGenerator)
		{
			if (kernelGenerator.GetKernelBands().Count == 0)
			{
				return null;
			}

			EllipseRadius maxBlurRadius = null;

            if ((ellipse.Radius.X < minDiffBetweenStops) && (ellipse.Radius.Y < minDiffBetweenStops))
            {
                maxBlurRadius = new EllipseRadius(minDiffBetweenStops, minDiffBetweenStops);
            }
            else
            {
                double factor = 0.9;
                bool widthGtHight = ellipse.Radius.X > ellipse.Radius.Y;
                
                if (widthGtHight)
                {
                    maxBlurRadius = new EllipseRadius(factor, factor * ellipse.Radius.Y / ellipse.Radius.X);
                }
                else
                {
                    maxBlurRadius = new EllipseRadius(factor * ellipse.Radius.X / ellipse.Radius.Y, factor);
                }
            }

			var gradient = new RadialGradient(ellipse.Center, maxBlurRadius);
			SetGradientStops(gradient, ellipse, maxBlurRadius, kernelGenerator);

			return gradient;
		}
示例#3
0
        private static void SetGradientStops(RadialGradient gradient, FocusEllipse ellipse, EllipseRadius maxBlurRadius, KernelGenerator kernelGenerator)
        {
            var stops = new List <GradientStop>();

            double firstStopOffset;

            if (maxBlurRadius.X > minDiffBetweenStops)
            {
                firstStopOffset = ellipse.Radius.X / maxBlurRadius.X;

                //Add the focus area at the center of the ellipse.
                stops.Add(new GradientStop()
                {
                    Color = Color.FromArgb(255, 0, 0, 0), Offset = 0
                });
                stops.Add(new GradientStop()
                {
                    Color = Color.FromArgb(255, 0, 0, 0), Offset = firstStopOffset
                });
            }
            else
            {
                firstStopOffset = minDiffBetweenStops;
            }

            double sumOfBandWidths   = kernelGenerator.GetKernelBands().Select(band => band.Width).Sum();
            var    currentStopOffset = firstStopOffset + minDiffBetweenStops;

            var kernelBands = kernelGenerator.GetKernelBands();

            byte kernelIndex = 0;

            foreach (var band in kernelBands)
            {
                kernelIndex++;
                stops.Add(new GradientStop()
                {
                    Color = Color.FromArgb(255, kernelIndex, kernelIndex, kernelIndex), Offset = currentStopOffset
                });
                currentStopOffset = currentStopOffset + (band.Width / sumOfBandWidths) * (1 - firstStopOffset) * FocusToBlurTransitionWidth;
            }
            stops.Add(new GradientStop()
            {
                Color = Color.FromArgb(255, kernelIndex, kernelIndex, kernelIndex), Offset = currentStopOffset
            });

            var validStops = EnsureMinDiffBetweenPoints(stops);

            gradient.Stops = validStops.ToArray();
        }
        public EllipseTiltDoF()
        {
            Name = "EllipseTiltDoF";

            m_ellipseFocus1   = new FocusEllipse(new Point(0.5, 0.3), new EllipseRadius(0.05, 0.2));
            m_ellipseFocus2   = new FocusEllipse(new Point(0.5, 0.7), new EllipseRadius(0.05, 0.2));
            m_selectedEllipse = m_ellipseFocus1;

            //Editors.Add(new EnumEditorViewModel<EllipseTiltDoF, DepthOfFieldQuality>("Quality", this, (effect) =>
            //{
            //    if (effect.m_effectEffect == null) return DepthOfFieldQuality.Preview;
            //    return effect.m_effectEffect.Quality;
            //}, (effect, value) =>
            //{
            //    if (effect.m_effectEffect == null)
            //        return;
            //    effect.m_effectEffect.Quality = value;
            //}));

            //Editors.Add(new BoolEditorViewModel<EllipseTiltDoF>("InvertedEllipse", this, (effect) =>
            //{
            //    return effect.m_invertedEllipse;
            //}, (effect, value) =>
            //{
            //    effect.m_invertedEllipse = value;
            //    effect.m_selectedEllipse = value ? m_ellipseFocus2 : m_ellipseFocus1;
            //}));

            Editors.Add(new RangeEditorViewModelEx <EllipseTiltDoF>("Strength", 0, 1.0, this, (effect) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return(1.0);
                }
                return(effect.m_effectEffect.Strength);
            }, (effect, value) =>
            {
                if (effect.m_effectEffect == null)
                {
                    return;
                }
                effect.m_effectEffect.Strength = value;
            }));
        }
		private static void SetGradientStops(RadialGradient gradient, FocusEllipse ellipse, EllipseRadius maxBlurRadius, KernelGenerator kernelGenerator)
		{
			var stops = new List<GradientStop>();

            double firstStopOffset;

            if (maxBlurRadius.X > minDiffBetweenStops)
            {
                firstStopOffset = ellipse.Radius.X / maxBlurRadius.X;
                
                //Add the focus area at the center of the ellipse.
                stops.Add(new GradientStop() { Color = Color.FromArgb(255, 0, 0, 0), Offset = 0 });
                stops.Add(new GradientStop() { Color = Color.FromArgb(255, 0, 0, 0), Offset = firstStopOffset });
            }
            else
            {
                firstStopOffset = minDiffBetweenStops;
            }

			double sumOfBandWidths = kernelGenerator.GetKernelBands().Select(band => band.Width).Sum();
			var currentStopOffset = firstStopOffset + minDiffBetweenStops;

			var kernelBands = kernelGenerator.GetKernelBands();

			byte kernelIndex = 0;
			foreach (var band in kernelBands)
			{
				kernelIndex++;
				stops.Add(new GradientStop() { Color = Color.FromArgb(255, kernelIndex, kernelIndex, kernelIndex), Offset = currentStopOffset });
				currentStopOffset = currentStopOffset + (band.Width / sumOfBandWidths) * (1 - firstStopOffset) * FocusToBlurTransitionWidth;
			}
			stops.Add(new GradientStop() { Color = Color.FromArgb(255, kernelIndex, kernelIndex, kernelIndex), Offset = currentStopOffset });

			var validStops = EnsureMinDiffBetweenPoints(stops);

			gradient.Stops = validStops.ToArray();
		}