예제 #1
0
파일: Imager.cs 프로젝트: sxkote/sxcore
 public Imager Resize(int maxWidth, int maxHeight)
 {
     var param = new ImagerResizeParams(ImagerResizeType.Scale, new Size(maxWidth, maxHeight), Color.Empty);
     return this.Modify(param);
 }
예제 #2
0
파일: Imager.cs 프로젝트: sxkote/sxcore
 public Imager Modify(ImagerResizeType type, Size size)
 {
     var param = new ImagerResizeParams(type, size, Color.Empty);
     return this.Modify(param);
 }
예제 #3
0
파일: Imager.cs 프로젝트: sxkote/sxcore
        //public Imager Load(byte[] data)
        //{
        //    this.Image = null;
        //    if (data != null)
        //    {
        //        using (MemoryStream ms = new MemoryStream(data))
        //        {
        //            ms.Position = 0;
        //            this.Image = Image.FromStream(ms);
        //            this._properties = this.Image.PropertyItems;
        //            ms.Close();
        //        }
        //    }
        //    return this;
        //}
        //public PropertyItem GetProperty(int id)
        //{
        //    try
        //    {
        //        if (this.Image == null)
        //            return null;
        //        PropertyItem property = null;
        //        if (this.Image.PropertyItems != null && this.Image.PropertyItems.Length > 0)
        //            property = this.Image.GetPropertyItem(id);
        //        else if (this._properties != null && this._properties.Length > 0)
        //            property = this._properties.FirstOrDefault(p => p.Id == id);
        //        return property;
        //    }
        //    catch { return null; }
        //}
        //public string GetProperty(int id, Encoding encoding)
        //{
        //    try
        //    {
        //        var property = this.GetProperty(id);
        //        if (property == null || property.Value == null || property.Len <= 0)
        //            return "";
        //        //return encoding.GetString(property.Value, 0, property.Len - ((encoding.IsSingleByte) ? 1 : 2);
        //        return encoding.GetString(property.Value, 0, property.Len).Trim(new char[] { '\0' });
        //    }
        //    catch { return ""; }
        //}
        //public void SetProperty(int id, string value, Encoding encoding)
        //{
        //    try
        //    {
        //        PropertyItem property = this.GetProperty(id);
        //        if (property == null)
        //            return;
        //        property.Value = encoding.GetBytes(value);
        //        this.Image.SetPropertyItem(property);
        //    }
        //    catch { }
        //}
        //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 Imager Pad(Size size, Color background)
        {
            var param = new ImagerResizeParams(ImagerResizeType.Fit, size, background);

            return this.Modify(param);
        }
예제 #4
0
파일: Imager.cs 프로젝트: sxkote/sxcore
        public Imager Modify(ImagerResizeParams param)
        {
            //размеры текущего изображения
            int image_width = this.Width;
            int image_height = this.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;
        }