System.Drawing.SolidBrush 使用啥混合方程?

Posted

技术标签:

【中文标题】System.Drawing.SolidBrush 使用啥混合方程?【英文标题】:What blend equation is System.Drawing.SolidBrush using?System.Drawing.SolidBrush 使用什么混合方程? 【发布时间】:2012-12-18 01:42:17 【问题描述】:

我有一些使用 System.Drawing.SolidBrush 绘制半透明三角形的 GDI 代码。我正在尝试使用适当的 3D 渲染 API (OpenGL/Direct3D11) 重新实现代码,但我不确定这些三角形使用什么混合方程来获得与原始 GDI 代码相同的输出。

我认为它是相对简单的,例如加法混合 (func=GL_FUNC_ADD, eq=GL_ONE,GL_ONE) 或插值 (func=GL_FUNC_ADD, eq=GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),但看起来都不太正确。这几乎可以肯定是我的新代码中的一个错误,但我想确保在继续之前我正在朝着正确的目标努力。有人知道合适的混合方程式吗?

编辑:这是相关的 C# 代码,没有上下文:

using System.Drawing;
SolidBrush b = new SolidBrush(Color.FromArgb(alpha,red,green,blue));
Point[] points = ...;
Graphics g;
g.FillPolygon(b,points);

我的问题是,根据画笔的 RGBA 和目标像素的 RGBA,实际会写入什么颜色?我能找到的所有文档都只是说“使用 alpha 来控制画笔的透明度”或同样模糊的东西;我很好奇实际的混合方程是什么。

【问题讨论】:

您尝试重新实现的“GDI 代码”是什么? 这是我正在尝试恢复并集成到一个新的非 GDI 项目中的一个长期离职同事的一些图像处理代码。细节是专有的,但与问题并不十分相关。不过,如果有帮助的话,我已经添加了相关代码的 sn-p。 【参考方案1】:

根据MSDN,System.Drawing.Graphics 有一个名为CompositingMode 的属性,可以是SourceOverSourceCopy

默认是SourceOver,即

指定当一种颜色被渲染时,它与背景颜色混合。混合由正在渲染的颜色的 alpha 分量决定。

正如我测试过的,这里使用的混合策略是alpha composition,它通过以下等式确定图像A对图像B区域中的像素值:

这里αa和αb是图像A和图像B的归一化alpha值; Ca和Cb分别是图像A和图像B的RGBA值; Co是输出图像的RGBA值。

【讨论】:

以上是关于System.Drawing.SolidBrush 使用啥混合方程?的主要内容,如果未能解决你的问题,请参考以下文章