在透明的Form C#上绘制不透明度

时间:2017-03-20 08:48:02

标签: c# gdi

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

当试图绘制透明的东西时,它根本不起作用。随着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 / Background颜色匹配,而semiTransBrush介于我想要的颜色和背景之间。不管怎么说?

2 个答案:

答案 0 :(得分:1)

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

alpha blending in .NET州的定义:

  

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

     

Alpha混合是一种   逐个像素地混合源和背景颜色数据。每个   给定源颜色的三个分量(红色,绿色,蓝色)是   与背景颜色的相应组件混合   根据以下公式:

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

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

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

e.Graphics.CompositingMode = CompositingMode.SourceCopy;

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

答案 1 :(得分:0)

<强>背景

Windows Forms构建于GDI和GDI +之上。

GDI是一种非常古老的技术,可以追溯到Windows历史的很长一段时间,并且不是为了识别alpha而设计的。

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

不幸的是,GDI +并没有让GDI识别alpha,在某些情况下它只会伪造alpha。

您的情景

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

我的情景

在我的情况下,我试图为无边框形式绘制阴影。有效。但它真是太糟糕了。

我已经实现了你想要做的事情,但你不会完全用Managed C#/ .NET做到这一点;您将不得不使用P / Invoke直接调用GDI / GDI +。