删除图像c#的圆形透明部分

Remove a round transparent section of an Image c#

我正在位图上创建一个圆,但想在其中打一个洞。搜索半小时后,我只找到了将图像裁剪成圆形的方法。困难的是,中间的孔应该像图像的其余部分一样透明。

This is the base image and the yellow circle表示应该添加的透明区域

感谢您的帮助。

开始很简单:通过执行 g.Clear(Color.Transparent) 然后 draw/fill 一个颜色的圆来创建透明位图。

下一步有点棘手:接下来你要用透明度绘制孔。

为此,您需要将 Graphics 对象切换到右侧 CompositingMode;默认是 SourceOver 但你想要 SourceCopy。前者 叠加 alpha 值创建混合颜色。后者将做我们想要的:通过 复制 绘制的颜色 包括 alpha 直接覆盖旧颜色来绘制孔..

这是一个例子:

Bitmap bmp = new Bitmap(500, 500);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.Clear(Color.Transparent);
    //g.SmoothingMode = SmoothingMode.AntiAlias;
    g.CompositingMode = CompositingMode.SourceCopy;
    g.FillEllipse(Brushes.DarkGreen, 100, 100, 300, 300);
    g.FillEllipse(Brushes.Transparent, 200, 200, 100, 100);
}
pictureBox1.Image = bmp;

这是 PictureBoxBackgroundImage 的样子:

一些注意事项:

  • 你也可以使用半透明画笔创建一个'tinted'洞;但是不要为此使用抗锯齿,因为它会引入彩色条纹。

  • 我们在这里使用了简单的圆圈,但是使用 GraphicsPath 您可以创建和填充几乎任何形状和复杂度的形状..

  • 并且使用 GraphicsPath 也可以替代填充透明度:通过 first 添加大和 然后 较小的内部椭圆路径会创建一个洞并填充它会有完全相同的结果!但是我发现上面的解决方案更有启发性..

  • 最后说明:正如 clarkitect 指出的那样,要保存,请使用支持透明的格式。始终推荐 Png..