C# 如何使用';透明白色';?

C# 如何使用';透明白色';?,c#,graphics,C#,Graphics,我想用“透明白”替换位图矩形区域中的所有像素,即a=0、b=255、r=255、g=255 FillRectangle不这样做-给定一个透明笔刷,现有像素不变 我需要为矩形中的每个像素单独使用SetPixel吗 FillRectangle不这样做-给定一个透明笔刷,现有像素不变 有意义,因为您正在使用0%的不透明度进行绘制。:) 控件的快速解决方案是使用颜色键。您可以将控件的键颜色设置为特定颜色(即洋红色);所有这种颜色的像素都将被渲染为透明。(当然,如果控件支持它。) 使透明(颜色)用于一般用

我想用“透明白”替换位图矩形区域中的所有像素,即a=0、b=255、r=255、g=255

FillRectangle不这样做-给定一个透明笔刷,现有像素不变

我需要为矩形中的每个像素单独使用SetPixel吗

FillRectangle不这样做-给定一个透明笔刷,现有像素不变

有意义,因为您正在使用0%的不透明度进行绘制。:)

控件的快速解决方案是使用颜色键。您可以将控件的键颜色设置为特定颜色(即洋红色);所有这种颜色的像素都将被渲染为透明。(当然,如果控件支持它。)

使透明(颜色)用于一般用途。问题是,同样,指定的颜色是透明的,因此您必须选择图像中不存在的颜色。(这里还有一个例子:)

编辑: 最后,其他评论中提到的LockBits()方法可能就是您想要的。一旦您了解了宽度和步幅值是如何相互作用的,就很容易在尽可能低的级别上操纵图像。 下面是一个通用示例:
只需确保图像支持透明度(请参见PixelFormat),然后使用适当的模式锁定图像(即PixelFormat.Format32bppArgb),循环每个像素,读取字节,写入新颜色,等等。

如果使用合成绘制方法,则将使用alpha混合颜色,因此不会发生任何事情

如果要设置位图,请从具有所需背景的数据创建位图,或使用设置背景来整体操作数据


您也可以使用带有适当标志的bitblt方法,但我不知道如何将其转换为托管代码。

这个小技巧应该可以做到:

Graphics g = Graphics.FromImage(myBitmap);
g.SetClip(new RectangleF(10, 10, 20, 20));
g.Clear(Color.Transparent);
g.RestoreClip();
g.Dispose();

我认为您需要使用SetPixel(或直接设置颜色值的等效方法)将像素设置为“透明白色”

您可以使用
Graphics.Clear
方法设置颜色或像素,但不能同时将它们设置为透明和颜色。我尝试设置位图的一部分中的像素:

using (Graphics g = Graphics.FromImage(theBitmap)) {
  g.Clip = new Region(new Rectangle(10, 10, 80, 80));
  g.Clear(Color.FromArgb(0, Color.White));
}
该区域中的像素最终为“透明黑色”:0,0,0,0。即使在清除之前绘制一个纯白色矩形也没有帮助。当颜色中的alpha为零时,其他颜色分量也为零


使用几乎透明的alpha-like 1可以很好地工作,像素最终会变成“几乎透明的白色”:1255255255。

您必须设置
Graphics.CompositingMode
属性。例如:

protected override void OnPaint(PaintEventArgs e) {
    var img = Properties.Resources.Chrysanthemum;
    e.Graphics.DrawImage(img, 0, 0);
    e.Graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    using (var br = new SolidBrush(Color.FromArgb(0, 255, 255, 255))) {
        e.Graphics.FillRectangle(br, new Rectangle(50, 50, 100, 100));
    }
}

您使用的实际颜色无关紧要,您将得到一个alpha为0的黑色矩形。

重要提示:

确保在创建图像时执行此操作

mainImage = new Bitmap(totalWidth, maxHeight, PixelFormat.Format32bppARgb);
而不是

mainImage = new Bitmap(totalWidth, maxHeight, PixelFormat.Format32bppRgb);

这会给你省去一些麻烦。不要假设32位表示alpha通道;-)

是的,这完全有道理:)我只是说。除此之外,我不认为你的答案是相关的-我的工作与位图,而不是控制。虽然我可以把矩形画成一种特定的颜色(希望这种颜色不会出现在图像的其他地方),然后使它透明,但我能指定“透明白色”吗?我不这么认为。你的位图.MakeTransparent(Color.White)应该可以做到这一点。缺点是白色的东西都是透明的,这是真的。问题在于并非所有图像格式都支持透明度,因此它可能还取决于图像对象的创建方式。查看PixelFormat枚举和成员。然后,当然,锁定位图的方法将在“不安全”指针维度中工作。皮特说了些什么不。将像素设置为“透明黑色”:0,0,0,0,而不是“透明白色”:0255255。您可以将其更改为
g.Clear(Color.FromArgb(0,255,255,255))尽管汉斯·帕桑的答案可能更好,但使用彩色通道获取数据并不少见,比如说在一个水、路、岩石、雪都是ARGB的游戏中绘制地形图。因此,您有时确实希望能够创建具有零alpha和非零RGB值的位图。顺便说一句,我的例子中的颜色是相关的,因为稍后的处理将透明区域颜色与其他区域颜色“混合”。