gpt4 book ai didi

c# - 如何在 c#/winforms 中将图像裁剪成圆形?

转载 作者:行者123 更新时间:2023-11-30 15:17:10 27 4
gpt4 key购买 nike

编辑:“重复”问题中给出的代码没有为我解决问题。

我遇到的主要问题是我不能简单地使用 CSS 和半径,这很容易。

这是一个正在加载的图像,在 winforms 页面/项目中。我必须尝试将正方形/矩形图像制作成圆形。我尝试了以下两种方法(结果将在每种方法下方发布):

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(medwImg);
Image RoundedImage = btn.RoundCorners(StartImage, 100, Color.Transparent);
btn.NormalImage = RoundedImage;

结果:

RoundCorners

如果将半径值更改为 145,您可以看到以下结果:

RoundCorners145

如您所见,也不好。

这是我的第二种方法:

public Image CropToCircle(Image srcImage, Color backGround)
{
Image dstImage = new Bitmap(srcImage.Width, srcImage.Height, srcImage.PixelFormat);
Graphics g = Graphics.FromImage(dstImage);

using (Brush br = new SolidBrush(backGround))
{
g.FillRectangle(br, 0, 0, dstImage.Width, dstImage.Height);
}

GraphicsPath path = new GraphicsPath();
path.AddEllipse(0, 0, dstImage.Width, dstImage.Height);
g.SetClip(path);
g.DrawImage(srcImage, 0, 0);

return dstImage;
}

被调用的代码:

Image StartImage = Image.FromFile(medwImg);
Image RoundedImage = btn.CropToCircle(StartImage, Color.FromArgb(0, 101, 167));
btn.NormalImage = RoundedImage;

这里的结果如下:

CropToCircle

这看起来好多了,但仍然不是一个很好的完整圆圈。

我最好的猜测是第二种方法最接近好的解决方案,但我不知道下一步该怎么做才能从源图像创建一个完整的圆圈。

最佳答案

我已经使用以下方法找到了问题的答案:

// makes nice round ellipse/circle images from rectangle images
public Image ClipToCircle(Image srcImage, PointF center, float radius, Color backGround)
{
Image dstImage = new Bitmap(srcImage.Width, srcImage.Height, srcImage.PixelFormat);

using (Graphics g = Graphics.FromImage(dstImage))
{
RectangleF r = new RectangleF(center.X - radius, center.Y - radius,
radius * 2, radius * 2);

// enables smoothing of the edge of the circle (less pixelated)
g.SmoothingMode = SmoothingMode.AntiAlias;

// fills background color
using (Brush br = new SolidBrush(backGround))
{
g.FillRectangle(br, 0, 0, dstImage.Width, dstImage.Height);
}

// adds the new ellipse & draws the image again
GraphicsPath path = new GraphicsPath();
path.AddEllipse(r);
g.SetClip(path);
g.DrawImage(srcImage, 0, 0);

return dstImage;
}
}

调用方法的代码:

Image StartImage = Image.FromFile(medwImg);
Image RoundedImage = btn.ClipToCircle(StartImage, new PointF(StartImage.Width/2, StartImage.Height/2), StartImage.Width/2, Color.FromArgb(0, 101, 167));
btn.NormalImage = RoundedImage;

现在我得到漂亮的圆形图像(结果):

Round Image Success

关于c# - 如何在 c#/winforms 中将图像裁剪成圆形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47203162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com