【发布时间】:2018-04-22 12:35:34
【问题描述】:
编辑:“重复”问题中给出的代码并没有解决我的问题。
我遇到的主要问题是我不能简单地使用 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;
结果:
如果将半径值更改为 145,您可以看到以下结果:
如您所见,也不好。
这是我的第二种方法:
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;
这里的结果如下:
这看起来更好,但仍然不是一个漂亮的完整圆圈。
我最好的猜测是第二种方法最接近一个好的解决方案,但我不知道下一步该怎么做才能从源图像创建一个完整的圆。
【问题讨论】:
-
最简单的方法是遍历所有像素并检查每个像素是否 x^2 + y^2