如何使用替换而不是混合绘制
本文关键字:混合 绘制 何使用 替换 | 更新日期: 2023-09-27 18:00:43
我正试图在位图上"绘制"透明区域,就像在图像上打孔一样。
以下代码不会绘制透明线,因为在位图上绘制透明线当然会混合而不是替换。(为什么默认是执行两个绘图操作中更复杂的操作,这毫无意义。)
Bitmap myBitmap = new Bitmap(50, 50);
Graphics g = Graphics.FromImage(myBitmap);
g.FillRectangle(Brushes.Black, 0, 0, 50, 50);
g.FillEllipse(Brushes.Transparent, 25, 0, 25, 25); //Does nothing
g.DrawLine(Pens.Transparent, 0, 0, 50, 50); //Does nothing
我该如何修改它,使透明的圆和线取代位图中的内容,而不是混合?
(请注意,这是"绘制"完全透明的琐碎情况。我要实现的目标是能够"绘制"修改alpha通道,而无需创建自己的逐像素操作。不过,能够完成完全透明就足够了。)
以下文章中的答案建议重复,我也尝试了以下(不起作用)
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);
也用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");