C# 如何用替换代替混合绘制

C# 如何用替换代替混合绘制,c#,.net,graphics,gdi+,alphablending,C#,.net,Graphics,Gdi+,Alphablending,我试图在位图上“画”出透明区域——就像在图像上切洞一样 下面的代码没有绘制透明线,因为在位图上绘制透明线当然是混合而不是替换。(为什么默认情况下要执行两个图形操作中更复杂的操作,这毫无意义。) 我如何修改它,使一个透明的圆和线代替位图中的内容而不是混合 (请注意,这是“绘制”完全透明的一个小例子。我要做的是能够“绘制”修改alpha通道,而无需创建自己的逐像素操作。不过,能够完成完全透明就足够了。) 下面这篇文章的答案是重复的,我也尝试了下面的答案(这不起作用) 还使用SourceCopy对其

我试图在位图上“画”出透明区域——就像在图像上切洞一样

下面的代码没有绘制透明线,因为在位图上绘制透明线当然是混合而不是替换。(为什么默认情况下要执行两个图形操作中更复杂的操作,这毫无意义。)

我如何修改它,使一个透明的圆和线代替位图中的内容而不是混合

(请注意,这是“绘制”完全透明的一个小例子。我要做的是能够“绘制”修改alpha通道,而无需创建自己的逐像素操作。不过,能够完成完全透明就足够了。)


下面这篇文章的答案是重复的,我也尝试了下面的答案(这不起作用)


还使用
SourceCopy

对其进行了测试,这对我来说完全正常

Bitmap bmp = new Bitmap(50, 50, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
    g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25);
    g.DrawLine(Pens.Transparent, 0, 0, 50, 50);
    g.Flush();
}
bmp.Save("Test.bmp");

可能是5点的复制品。我将在周一查看所有答案并接受。问题还没解决!这就是我正在测试的东西,但它不起作用。你的位图允许透明吗?您可能希望像在我的编辑中那样设置格式。实际上,我使用的是
Format32bppPargb
它不能解决实际问题(我添加的内容说明了我在链接的建议副本中尝试过),但它确实完全按照我的要求解决了问题。干得好@AppFzx此答案显示应用的解决方案
CompositingMode.SourceCopy
是您在这里的朋友,然后喜欢使用
alpha=0
创建一支钢笔:
新钢笔(颜色.FromArgb(0,255,255,255),3)
        base.OnPaint(e);
        Bitmap myBitmap = new Bitmap(50, 50);
        e.Graphics.FillRectangle(Brushes.Black, 0, 0, 50, 50);
        Graphics g = Graphics.FromImage(myBitmap);
        g.FillEllipse(new SolidBrush(Color.FromArgb(150, 125, 125, 125)), 25, 0, 25, 25);
        g.DrawLine(new Pen(Color.FromArgb(150,25,25,25)), 0, 0, 50, 50);
        g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        e.Graphics.DrawImage(myBitmap, 0, 0);
Bitmap bmp = new Bitmap(50, 50, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
    g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25);
    g.DrawLine(Pens.Transparent, 0, 0, 50, 50);
    g.Flush();
}
bmp.Save("Test.bmp");