混合由FreeType以颜色和alpha

时间:2015-11-03 19:38:55

标签: c image-processing language-agnostic alpha freetype

我使用FreeType渲染一些文本。

我想要绘制文本的表面是格式为ARGB的位图图像,预先乘以alpha。

文本所需的颜色也是ARGB。

渲染的FT_Bitmap具有格式FT_PIXEL_MODE_LCD - 它是在黑色背景上使用白色渲染文本,并使用子像素抗锯齿。

因此,对于每个像素,我有3个数字:

Da, Dr, Dg, Db - 目标像素ARGB(背景图片)。

Fr, Fg, Fb - FreeType渲染像素(使用FT_RENDER_MODE_LCD渲染的FT_Bitmap)

Ca, Cr, Cg, Cb - 我想要使用的文字的颜色。

所以,问题是:如何正确组合这3个数字以获得结果位图像素。

理论答案可以,甚至比代码样本更好。

2 个答案:

答案 0 :(得分:1)

将FreeType数据作为实际RGB颜色(这些' raw'值用于绘制黑色文本),但作为目标文本颜色的强度

因此,每个F颜色分量的完整强度为F*C/255。但是,由于您的C还包含alpha分量,因此强度会按比例缩放:

 s' = F*C*A/(255 * 255)

当然,假设FCA在0..255的正常范围内。 A是一个分数A/255,第二个分区是将F*C带回目标范围。 s'现在是派生的源颜色。

开始绘制它。每个颜色组件,新颜色会添加到D,而D反过来会被源的{alpha} 255-A(缩放)所玷污。

这导致全额

D' = D*(255-A)/255 + F*C*A/(255 * 255)

等于(向右移动一个值)

D' = (D*(255-A) + F*C*A/255)/255

表示DFCA的每个单独频道r,g,b。最后一个alpha也需要为每个通道单独计算,因为FreeType输出数据会返回此格式。

如果计算太慢,您可以将视觉结果与FreeType的非LCD优化灰度输出进行比较。我怀疑,尤其是忙碌的' (不完全是单色的)背景,额外的计算根本不值得 纯灰度输入的数字优势在于,您只需为RGB颜色的每个三元组计算一次A1-A

"背景"还有一个alpha通道,但是要绘制文字" on"你可以认为这是'未使用的'。将透明项目绘制到另一个透明项目上通常不会改变其内在透明度。

答案 1 :(得分:1)

经过一番发现,我找到了正确的答案。这令人失望。

无法在RGBA格式的透明图像上绘制亚像素渲染图形(包括字体)。

为了正确渲染此类图形,必须使用支持每种颜色的单独Alpha通道的格式。

例如每像素48位:RrGgBg其中r,g和b分别是红色,绿色和蓝色collor通道的alpha通道。