混合由FreeType以颜色和alpha呈现的文本

我使用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个数字以获得结果位图像素.

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

最佳答案 将FreeType数据作为实际RGB颜色进行插入(这些“原始”值用于绘制黑色文本),但是作为目标文本颜色的强度.

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

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

当然,假设F,C和A在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

对于D,F,C和A的每个单独通道r,g,b.最后一个,alpha,还需要为每个通道单独计算,因为FreeType输出数据返回此格式.

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

“背景”也有一个alpha通道,但要在“on”上绘制文本,你可以将其视为“未使用”.通常,将透明项目绘制到另一个透明项目上不会改变其内在透明度.

点赞