Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
        }