/// <summary> /// In Fill Mode, we will blur and fill the background /// </summary> /// <param name="file"></param> /// <param name="parameter"></param> private static void FillBackground(Image source, Graphics target, ImageFiltrationParameters parameter) { if (parameter.Mode != ImageResizeMode.FitWithBg) { return; } // get blurred image and draw using fit width mode var blurFilter = new AForge.Imaging.Filters.GaussianBlur(8, 10); using (var blurred = blurFilter.Apply((Bitmap)source)) { var p = new ImageFiltrationParameters(source, parameter.TargetWidth, parameter.TargetHeight, ImageResizeMode.Fill); var darken = new AForge.Imaging.Filters.BrightnessCorrection(-100); darken.ApplyInPlace(blurred); target.DrawImage(blurred, p.ImageOffsetAndSize.Left, p.ImageOffsetAndSize.Top, p.ImageOffsetAndSize.Width, p.ImageOffsetAndSize.Height); } }
/// <summary> /// Get Resized Image /// </summary> /// <param name="width">Desired with of the image - will be set to actual image width</param> /// <param name="height">Desired height of the image - will be set to actual image height</param> /// <returns></returns> public static ResizeResult ResizeAndFilterImage(string file, ImageFiltrationParameters parameters) { var result = new ResizeResult(); result.Output = new MemoryStream(); result.SourceFile = file; // make sure we have no problem with file lock var source = File.ReadAllBytes(file); using (var ms = new MemoryStream(source)) using (var b = Bitmap.FromStream(ms)) { bool isPNG = b.RawFormat.Equals(ImageFormat.Png); bool isJPEG = b.RawFormat.Equals(ImageFormat.Jpeg); parameters.Validate(b); Bitmap newBitMap = null; #region Resize if (parameters.IsProcessResize == true) { newBitMap = new Bitmap(parameters.TargetWidth, parameters.TargetHeight); var g = Graphics.FromImage(newBitMap); if (isPNG == true) { g.Clear(Color.Transparent); } else { g.Clear(Color.White); } ImageResizeModule.FillBackground(b, g, parameters); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; g.DrawImage(b, parameters.ImageOffsetAndSize.Left, parameters.ImageOffsetAndSize.Top, parameters.ImageOffsetAndSize.Width, parameters.ImageOffsetAndSize.Height); g.Dispose(); } else { newBitMap = (Bitmap)b; } #endregion #region Filtration if (parameters.Filters != null) { foreach (var filter in parameters.Filters) { if (filter.ToLower() == "grayscale") { var filtered = AForge.Imaging.Filters.Grayscale.CommonAlgorithms.Y.Apply(newBitMap); newBitMap.Dispose(); newBitMap = filtered; continue; } var name = " AForge.Imaging.Filters." + filter; var filterType = Assembly.GetAssembly(typeof(AForge.Imaging.Filters.BaseFilter)).GetType(name, false, true); if (filterType == null || filterType.IsAbstract || filterType.IsInterface || !filterType.IsPublic) { throw new InvalidOperationException("Filter name " + filter + " is not valid"); } try { var instance = Activator.CreateInstance(filterType) as AForge.Imaging.Filters.IFilter; if (instance == null) { throw new InvalidOperationException("Filter name " + filter + " is not valid"); } var filtered = instance.Apply(newBitMap); newBitMap.Dispose(); newBitMap = filtered; } catch (Exception ex) { throw new InvalidOperationException("Filter name " + filter + " is not valid", ex); } } } #endregion if (isJPEG == true) { var ep = new EncoderParameters(); ep.Param[0] = new EncoderParameter(Encoder.Quality, 95L); var ici = (from item in ImageCodecInfo.GetImageEncoders() where item.MimeType.Equals("image/jpeg", StringComparison.OrdinalIgnoreCase) select item).FirstOrDefault(); try { newBitMap.Save(result.Output, ici, ep); } catch (Exception) { newBitMap.Save(result.Output, ImageFormat.Jpeg); } result.ContentType = "image/jpeg"; } else { result.ContentType = "image/png"; newBitMap.Save(result.Output, ImageFormat.Png); } newBitMap.Dispose(); } result.Output.Position = 0; return(result); }