protected void ApplyFiltersTo(ref Bitmap b, ImageState s) { //TODO: if the image is unrotated, use a rectangle to limit the effect to the desired area string str = null; int i = 0; //If radiusunits is specified, use that code path. double units = s.settings.Get<double>("a.radiusunits",1000); i = GetRadius(s, "blur", "a.blur", units); if (i > 0) new GaussianBlur(1.4, i).ApplyInPlace(b); i = GetRadius(s, "sharpen", "a.sharpen", units); if (i > 0) new GaussianSharpen(1.4, Math.Min(11,i)).ApplyInPlace(b); i = GetRadius(s, "a.oilpainting", null, units); if (i > 0) new OilPainting(i).ApplyInPlace(b); if ("true".Equals(s.settings["a.removenoise"], StringComparison.OrdinalIgnoreCase)) { new ConservativeSmoothing(3).ApplyInPlace(b); } else { i = GetRadius(s, "a.removenoise", null, units); if (i > 0) new ConservativeSmoothing(i).ApplyInPlace(b); } //Sobel only supports 8bpp grayscale images. //true/false if ("true".Equals(s.settings["a.sobel"], StringComparison.OrdinalIgnoreCase)){ Bitmap old = b; try{ b = Grayscale.CommonAlgorithms.Y.Apply(b); }finally{ if (old != s.sourceBitmap) old.Dispose(); } new SobelEdgeDetector().ApplyInPlace(b); str = s.settings["a.threshold"]; //radius if (!string.IsNullOrEmpty(str) && int.TryParse(str, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out i) && i > 0) new Threshold(i).ApplyInPlace(b); } //Canny Edge Detector only supports 8bpp grayscale images. //true/false if ("true".Equals(s.settings["a.canny"], StringComparison.OrdinalIgnoreCase)) { Bitmap old = b; try { b = Grayscale.CommonAlgorithms.Y.Apply(b); } finally { if (old != s.sourceBitmap) old.Dispose(); } new CannyEdgeDetector().ApplyInPlace(b); } //true/false - duplicate with SimpleFilters? if ("true".Equals(s.settings["a.sepia"], StringComparison.OrdinalIgnoreCase)) new Sepia().ApplyInPlace(b); //true/false if ("true".Equals(s.settings["a.equalize"], StringComparison.OrdinalIgnoreCase)) new HistogramEqualization().ApplyInPlace(b); ///White balance adjustment var whiteAlg = s.settings.Get<HistogramThresholdAlgorithm>("a.balancewhite"); var whiteVal = s.settings.Get<double>("a.balancethreshold"); if (whiteAlg != null || whiteVal != null) { var bal = new AutoWhiteBalance(whiteAlg ?? HistogramThresholdAlgorithm.Area); if (whiteVal != null) bal.LowThreshold = bal.HighThreshold = whiteVal.Value / 100; bal.ApplyInPlace(b); } str = s.settings["a.posterize"]; //number of colors to merge if (!string.IsNullOrEmpty(str) && int.TryParse(str, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out i) && i > 0) { SimplePosterization sp = new SimplePosterization(); if (i < 1) i = 1; if (i > 255) i = 255; sp.PosterizationInterval =(byte)i; sp.ApplyInPlace(b); } //Pixellate doesn't support 32-bit images, only 24-bit //str = s.settings["a.pixelate"]; //number of colors to merge //if (!string.IsNullOrEmpty(str) && int.TryParse(str, out i)){ // if (i < 2) i = 2; // if (i > 32) i = 32; // new Pixellate(i).ApplyInPlace(s.destBitmap); //} float contrast = s.settings.Get<float>("a.contrast", 0); float brightness = s.settings.Get<float>("a.brightness", 0); float saturation = s.settings.Get<float>("a.saturation", 0); if (contrast != 0 || brightness != 0 || saturation != 0){ HSLLinear adjust = new HSLLinear(); AdjustContrastBrightnessSaturation(adjust, contrast, brightness, saturation, "true".Equals(s.settings["a.truncate"])); adjust.ApplyInPlace(b); } //TODO - add grayscale? //For adding fax-like thresholding, use BradleyLocalThresholding //For trimming solid-color whitespace, use Shrink }
protected void ApplyFiltersTo(ref Bitmap b, ImageState s) { var imageRectF = s.layout.GetRingAsRectF("image"); var areaOfEffect = imageRectF == null ? new Rectangle(0, 0, b.Width, b.Height) : PolygonMath.ToRectangleShrinkRound(imageRectF.Value); //TODO: if the image is unrotated, use a rectangle to limit the effect to the desired area string str = null; int i = 0; //If radiusunits is specified, use that code path. double units = s.settings.Get <double>("a.radiusunits", 1000); //TODO: move blur/sharpen aliases to a compatibility shim, deprecate them i = GetRadius(s, "blur", "a.blur", units); if (i > 0) { new GaussianBlur(1.4, i).ApplyInPlace(b, areaOfEffect); } i = GetRadius(s, "sharpen", "a.sharpen", units); if (i > 0) { new GaussianSharpen(1.4, Math.Min(11, i)).ApplyInPlace(b, areaOfEffect); } i = GetRadius(s, "a.oilpainting", null, units); if (i > 0) { new OilPainting(i).ApplyInPlace(b, areaOfEffect); } if ("true".Equals(s.settings["a.removenoise"], StringComparison.OrdinalIgnoreCase)) { new ConservativeSmoothing(3).ApplyInPlace(b, areaOfEffect); } else { i = GetRadius(s, "a.removenoise", null, units); if (i > 0) { new ConservativeSmoothing(i).ApplyInPlace(b, areaOfEffect); } } //Sobel only supports 8bpp grayscale images. //true/false if ("true".Equals(s.settings["a.sobel"], StringComparison.OrdinalIgnoreCase)) { Bitmap old = b; try{ b = Grayscale.CommonAlgorithms.Y.Apply(b); }finally{ if (old != s.sourceBitmap) { old.Dispose(); } } new SobelEdgeDetector().ApplyInPlace(b, areaOfEffect); str = s.settings["a.threshold"]; //radius if (!string.IsNullOrEmpty(str) && int.TryParse(str, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out i) && i > 0) { new Threshold(i).ApplyInPlace(b, areaOfEffect); } } //Canny Edge Detector only supports 8bpp grayscale images. //true/false if ("true".Equals(s.settings["a.canny"], StringComparison.OrdinalIgnoreCase)) { Bitmap old = b; try { b = Grayscale.CommonAlgorithms.Y.Apply(b); } finally { if (old != s.sourceBitmap) { old.Dispose(); } } new CannyEdgeDetector().ApplyInPlace(b, areaOfEffect); } //true/false - duplicate with SimpleFilters? if ("true".Equals(s.settings["a.sepia"], StringComparison.OrdinalIgnoreCase)) { new Sepia().ApplyInPlace(b, areaOfEffect); } //true/false if ("true".Equals(s.settings["a.equalize"], StringComparison.OrdinalIgnoreCase)) { new HistogramEqualization().ApplyInPlace(b, areaOfEffect); } //White balance adjustment var whiteAlg = s.settings.Get <HistogramThresholdAlgorithm>("a.balancewhite"); var whiteVal = s.settings.Get <double>("a.balancethreshold"); if (whiteAlg != null || whiteVal != null) { var bal = new AutoWhiteBalance(whiteAlg ?? HistogramThresholdAlgorithm.Area); if (whiteVal != null) { bal.LowThreshold = bal.HighThreshold = whiteVal.Value / 100; } bal.ApplyInPlace(b, areaOfEffect); } str = s.settings["a.posterize"]; //number of colors to merge if (!string.IsNullOrEmpty(str) && int.TryParse(str, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out i) && i > 0) { SimplePosterization sp = new SimplePosterization(); if (i < 1) { i = 1; } if (i > 255) { i = 255; } sp.PosterizationInterval = (byte)i; sp.ApplyInPlace(b, areaOfEffect); } //Pixelate doesn't support 32-bit images, only 24-bit //str = s.settings["a.pixelate"]; //number of colors to merge //if (!string.IsNullOrEmpty(str) && int.TryParse(str, out i)){ // if (i < 2) i = 2; // if (i > 32) i = 32; // new Pixelate(i).ApplyInPlace(s.destBitmap); //} float contrast = s.settings.Get <float>("a.contrast", 0); float brightness = s.settings.Get <float>("a.brightness", 0); float saturation = s.settings.Get <float>("a.saturation", 0); if (contrast != 0 || brightness != 0 || saturation != 0) { HSLLinear adjust = new HSLLinear(); AdjustContrastBrightnessSaturation(adjust, contrast, brightness, saturation, "true".Equals(s.settings["a.truncate"])); adjust.ApplyInPlace(b, areaOfEffect); } //TODO - add grayscale? //For adding fax-like thresholding, use BradleyLocalThresholding //For trimming solid-color whitespace, use Shrink }