/// <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; }
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(); }