//public Image RoundCorners(int radius, Color background_color)
        //{
        //    radius *= 2;
        //    Bitmap result = new Bitmap(this.Image.Width, this.Image.Height);

        //    using (Graphics g = Graphics.FromImage(result))
        //    {
        //        g.Clear(background_color);
        //        g.SmoothingMode = SmoothingMode.AntiAlias;

        //        using (Brush brush = new TextureBrush(this.Image))
        //        using (GraphicsPath gp = new GraphicsPath())
        //        {
        //            gp.AddArc(0, 0, radius, radius, 180, 90);
        //            gp.AddArc(0 + result.Width - radius, 0, radius, radius, 270, 90);
        //            gp.AddArc(0 + result.Width - radius, 0 + result.Height - radius, radius, radius, 0, 90);
        //            gp.AddArc(0, 0 + result.Height - radius, radius, radius, 90, 90);
        //            g.FillPath(brush, gp);

        //            this.Image = result;
        //        }
        //    }

        //    return this.Image;
        //}

        public ImagerService Pad(Size size, Color background)
        {
            var param = new ImagerResizeParams(ImagerResizeType.Fit, size, background);

            return(this.Modify(param));
        }
        public ImagerService Resize(int max_size)
        {
            var param = new ImagerResizeParams(ImagerResizeType.Scale, new Size(max_size, max_size), Color.Empty);

            return(this.Modify(param));
        }
        public ImagerService Modify(ImagerResizeType type, Size size)
        {
            var param = new ImagerResizeParams(type, size, Color.Empty);

            return(this.Modify(param));
        }
        public ImagerService Modify(ImagerResizeType type, int maxSize)
        {
            var param = new ImagerResizeParams(type, new Size(maxSize, maxSize), Color.Empty);

            return(this.Modify(param));
        }
        public ImagerService Modify(ImagerResizeParams param)
        {
            //размеры текущего изображения
            int image_width  = this.Image.Width;
            int image_height = this.Image.Height;

            //определяем процент сжатия, чтобы уложиться в новый размер
            float percent_width  = ((float)param.Size.Width / (float)image_width);
            float percent_height = ((float)param.Size.Height / (float)image_height);

            float percent = Math.Min(percent_height, percent_width);

            //если нужно обрезать, то изображение должно быть больше указанных размеров
            if (param.Type == ImagerResizeType.Crop)
            {
                percent = Math.Max(percent_height, percent_width);
            }

            //если менярь размеры не нужно, то процент === 1
            if (param.Type == ImagerResizeType.None)
            {
                percent = 1.0f;
            }

            //окончательные размеры сжатого изображения
            int redraw_width  = (int)(image_width * percent);
            int redraw_height = (int)(image_height * percent);

            //если нужно заполнить указанный размер с растяжением изображения
            if (param.Type == ImagerResizeType.Fill)
            {
                redraw_width  = param.Size.Width;
                redraw_height = param.Size.Height;
            }

            int canvas_width  = param.Size.Width;
            int canvas_height = param.Size.Height;

            //если мы просто меняем размеры изображения пропорционально
            // или не меняем размер изображения совсем
            // - холст должен совпадать с размерами измененного изображения
            if (param.Type == ImagerResizeType.None || param.Type == ImagerResizeType.Scale)
            {
                canvas_width  = redraw_width;
                canvas_height = redraw_height;
            }

            //результирующий холст - новое изображение в новых размерах
            Bitmap result = new Bitmap(canvas_width, canvas_height);

            //как-то не правильно получилось - задаю CROP в квадрат - а возвращает он мне прямоугольник!!!
            ////если цвет заполнения не задан, то незачем слушаться новых размеров - просто нужно отмасштабировать
            //if (param.Type == ImageResizeType.None || param.Background == Color.Empty)
            //    result = new Bitmap(redraw_width, redraw_height);

            using (Graphics graphics = Graphics.FromImage(result))
            {
                if (param.Background != Color.Empty)
                {
                    using (Brush br = new SolidBrush(param.Background))
                        graphics.FillRectangle(br, 0, 0, result.Width, result.Height);
                }

                graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                graphics.InterpolationMode  = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                graphics.SmoothingMode      = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                graphics.DrawImage(this.Image, (result.Width / 2) - (redraw_width / 2), (result.Height / 2) - (redraw_height / 2), redraw_width, redraw_height);
            }

            this.Image = result;

            return(this);
        }