首页 文章

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

提问于
浏览
1

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

当试图绘制透明的东西时,它根本不起作用 . 随着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

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

    alpha blending in .NET的定义指出:

    alpha值表示颜色的透明度 - 颜色与背景颜色混合的程度 . Alpha值的范围为0到255,其中0表示完全透明的颜色,255表示完全不透明的颜色 . Alpha混合是源和背景颜色数据的逐像素混合 . 根据以下公式,将给定源颜色的三个组分(红色,绿色,蓝色)中的每一个与背景颜色的相应组分混合:

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

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

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

    e.Graphics.CompositingMode = CompositingMode.SourceCopy;
    

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

  • 1

    Background

    Windows Forms构建在GDI和GDI之上 .

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

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

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

    Your Scenario

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

    My Scenario

    在我的情况下,我试图绘制一个无边框形式的投影 . 有效 . 但它真是太糟糕了 .

    我已经实现了你想要做的事情,但你不会纯粹使用Managed C#/ .NET;你将不得不使用P / Invoke直接调用GDI / GDI .

相关问题