在透明窗体 C# 上绘制不透明度



我有一个透明的表单。(只需匹配背景颜色和透明度键即可完成。

当尝试绘制透明的东西时,它根本不起作用。当 alpha 变量接近 0 时,绘制的颜色只会更接近表单的原始背景色。

SolidBrush opaqueBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));
SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(128, 0, 0, 255));
SolidBrush superTransBrush = new SolidBrush(Color.FromArgb(10, 0, 0, 255));

使用这 3 个画笔在常规表单上绘制将产生所需的效果。但是在我的透明表单上使用它只是将superTransBrush与我的transparencyKey/背景颜色相匹配,并且semiTransBrush介于我想要的颜色和背景之间。无论如何,围绕这个?

.NET 窗体本身似乎没有办法解决这个问题。

.NET 中 alpha 混合的定义状态:

alpha 值表示颜色的透明度 — 范围 颜色与背景颜色混合到其中。阿尔法值 范围从 0 到 255,其中 0 表示完全透明 颜色,255 表示完全不透明的颜色。

阿尔法混合是一种 源颜色和背景颜色数据的逐像素混合。每个 给定源颜色的三个分量(红色、绿色、蓝色)是 根据以下公式与背景色的相应成分混合

displayColor = sourceColor × alpha / 255 + backgroundColor × (255 – alpha) / 255

请注意,在计算 Alpha 混合时,没有考虑背景本身的透明度。

最接近的解决方法是将CompositingMode设置为源副本:

e.Graphics.CompositingMode = CompositingMode.SourceCopy;

这可以防止将透明色与背景色混合,因此您的画笔将是蓝色,而不是蓝色+背景色的混合。但是,您的画笔仍然不透明。

背景

Windows 窗体构建在 GDI 和 GDI+ 之上。

GDI是一项非常古老的技术,可以追溯到Windows历史上很久以前,并且不是为alpha感知而设计的。

GDI+ 随 WindowsXP 和后续产品一起提供,旨在通过 alpga 混合、抗锯齿和其他您期望从现代 2D 图形库中获得的功能来补充 GDI。

不幸的是,GDI+ 不会让 GDI alpha 感知,它只是在某些情况下伪造 alpha。

您的方案

在您的情况下,它会伪造 Alpha 通道,并在对表单执行透明度操作之前将 SolidBrush 颜色绘制到表单上,因此,渲染器会看到与您为透明度指定的颜色不同的颜色并忽略它。

我的方案

就我而言,我试图将阴影绘制为无边框形式。成功了。但它是地狱般的越野车。

我已经实现了您要执行的操作,但您不会纯粹使用托管 C#/.NET 来执行此操作;您必须使用 P/Invoke 直接调用 GDI/GDI+。

最新更新