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

C# 移除图像c的圆形透明部分#,c#,bitmap,transparency,system.drawing,C#,Bitmap,Transparency,System.drawing,我正在位图上创建一个圆,但希望在其中有一个孔。经过半个小时的搜索,我只找到了将图像裁剪成圆形的方法。最困难的是,中间的孔应该像图像的其余部分一样透明。 是基础图像,表示应添加的透明区域 感谢您的帮助。开始很简单:通过执行g.Clear(Color.transparent)创建一个透明位图,然后用颜色绘制/填充一个圆圈 下一步有点棘手:下一步要用透明度绘制孔 为此,您需要将图形对象切换到右侧的合成模式;默认值为SourceOver,但您需要SourceCopy。前一个覆盖了创建混合颜色的alpha

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

是基础图像,表示应添加的透明区域


感谢您的帮助。

开始很简单:通过执行
g.Clear(Color.transparent)
创建一个透明位图,然后用颜色绘制/填充一个圆圈

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

为此,您需要将图形对象切换到右侧的
合成模式
;默认值为
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;
这是具有
背景图像的
图片盒中的外观:

请注意:

  • 您还可以使用半透明笔刷创建“着色”孔;但不要使用抗锯齿,因为它会引入彩色条纹

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

  • 使用
    GraphicsPath
    也可以作为透明填充的替代方法:首先添加大的,然后较小的内部椭圆,路径将创建一个洞,填充它将得到非常相同的结果!但我发现上面的解决方案更有启发性

  • 最后一点注意:正如clarkitect所指出的,要保存,请使用支持透明度的格式<始终建议使用代码>Png


位图不支持透明度。幸运的是,您在问题中链接的图像不是位图,而是支持透明度的PNG图像。我建议你大量编辑你的问题,用“png”代替提及的“位图”。我冒昧地用
png
替换了
bitmap
标签,希望它能吸引到合适的专家:)好吧`新位图(20482048,System.Drawing.Imaging.PixelFormat.Format32bppArgb)`对我来说非常好而且是透明的@克拉克:不要将BMP文件格式与GDI位图对象混淆@太晚了;我已经这么做了。好吧,那你还有什么建议呢?非常感谢,我从来没有想到过这样的事情!