Как создать изображение с закругленными углами в C #? - PullRequest
8 голосов
/ 18 ноября 2009

Я хотел бы создать изображение (из другого) с закругленными углами с помощью GDI +. Какой лучший способ сделать это?

PS: это не для сети, поэтому я не могу использовать клиентский CSS

Ответы [ 5 ]

20 голосов
/ 19 ноября 2009

Эта функция, кажется, делает то, что вы хотите. Он также может быть легко изменен, чтобы при необходимости возвращать растровое изображение. Вам также нужно будет очистить любые изображения, которые вам больше не нужны, и т. Д. Адаптировано из: http://www.jigar.net/howdoi/viewhtmlcontent98.aspx

using System.Drawing;
using System.Drawing.Drawing2D;

public Image RoundCorners(Image StartImage, int CornerRadius, Color BackgroundColor)
{
    CornerRadius *= 2;
    Bitmap RoundedImage = new Bitmap(StartImage.Width, StartImage.Height);
    using(Graphics g = Graphics.FromImage(RoundedImage))
    {
      g.Clear(BackgroundColor);
      g.SmoothingMode = SmoothingMode.AntiAlias;
      Brush brush = new TextureBrush(StartImage);
      GraphicsPath gp = new GraphicsPath();
      gp.AddArc(0, 0, CornerRadius, CornerRadius, 180, 90);
      gp.AddArc(0 + RoundedImage.Width - CornerRadius, 0, CornerRadius, CornerRadius, 270, 90);
      gp.AddArc(0 + RoundedImage.Width - CornerRadius, 0 + RoundedImage.Height - CornerRadius, CornerRadius, CornerRadius, 0, 90);
      gp.AddArc(0, 0 + RoundedImage.Height - CornerRadius, CornerRadius, CornerRadius, 90, 90);
      g.FillPath(brush, gp);
      return RoundedImage;
    }
}

Image StartImage = Image.FromFile("YourImageFile.jpg");
Image RoundedImage = this.RoundCorners(StartImage, 25, Color.White);
//Use RoundedImage...
7 голосов
/ 19 ноября 2009

Лучше всего использовать метод Graphics.SetClip (). Например:

    public static Image OvalImage(Image img) {
        Bitmap bmp = new Bitmap(img.Width, img.Height);
        using (GraphicsPath gp = new GraphicsPath()) {
            gp.AddEllipse(0, 0, img.Width, img.Height);
            using (Graphics gr = Graphics.FromImage(bmp)) {
                gr.SetClip(gp);
                gr.DrawImage(img, Point.Empty);
            }
        }
        return bmp;
    }
5 голосов
/ 18 ноября 2009

Самый простой способ - использовать масштабируемую маску со скругленными углами. Примените маску к изображению и экспортируйте новое изображение.

Здесь - статья CodeProject, касающаяся именно этого.

2 голосов
/ 24 декабря 2013

В итоге я комбинировал https://stackoverflow.com/a/1759073 и https://stackoverflow.com/a/1759225, чтобы получить округленные изображения, поскольку я хотел, чтобы фон был прозрачным. Думал, что поделюсь этим:

private Image RoundCorners(Image image, int cornerRadius)
{
    cornerRadius *= 2;
    Bitmap roundedImage = new Bitmap(image.Width, image.Height);
    GraphicsPath gp = new GraphicsPath();
    gp.AddArc(0, 0, cornerRadius, cornerRadius, 180, 90);
    gp.AddArc(0 + roundedImage.Width - cornerRadius, 0, cornerRadius, cornerRadius, 270, 90);
    gp.AddArc(0 + roundedImage.Width - cornerRadius, 0 + roundedImage.Height - cornerRadius, cornerRadius, cornerRadius, 0, 90);
    gp.AddArc(0, 0 + roundedImage.Height - cornerRadius, cornerRadius, cornerRadius, 90, 90);
    using (Graphics g = Graphics.FromImage(roundedImage))
    {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.SetClip(gp);
        g.DrawImage(image, Point.Empty);
    }
    return roundedImage;
}
2 голосов
/ 06 декабря 2012

Все остальные ответы страдают от проблемы с искажением в 1 пиксель вдоль левой и верхней границы. Этот код устраняет проблему, смещая -1 пиксель слева и сверху при добавлении дуг для маски.

public static Image RoundCorners(Image StartImage, int CornerRadius, Color BackgroundColor)
{
    CornerRadius *= 2;
    Bitmap RoundedImage = new Bitmap(StartImage.Width, StartImage.Height);

    using(Graphics g = Graphics.FromImage(RoundedImage))
    {
       g.Clear(BackgroundColor);
       g.SmoothingMode = SmoothingMode.HighQuality;
       g.CompositingQuality = CompositingQuality.HighQuality;
       g.InterpolationMode = InterpolationMode.HighQualityBicubic;

       using(Brush brush = new TextureBrush(StartImage))
       {
          using(GraphicsPath gp = new GraphicsPath())
          {
             gp.AddArc(-1, -1, CornerRadius, CornerRadius, 180, 90);
             gp.AddArc(0 + RoundedImage.Width - CornerRadius, -1, CornerRadius, CornerRadius, 270, 90);
             gp.AddArc(0 + RoundedImage.Width - CornerRadius, 0 + RoundedImage.Height - CornerRadius, CornerRadius, CornerRadius, 0, 90);
             gp.AddArc(-1, 0 + RoundedImage.Height - CornerRadius, CornerRadius, CornerRadius, 90, 90);

             g.FillPath(brush, gp);
          }
       }

       return RoundedImage;
    }
}
...