我使用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个数字以获得结果位图像素。
理论答案可以,甚至比代码样本更好。
答案 0 :(得分:1)
将FreeType数据作为实际RGB颜色(这些' raw'值用于绘制黑色文本),但作为目标文本颜色的强度。
因此,每个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"你可以认为这是'未使用的'。将透明项目绘制到另一个透明项目上通常不会改变其内在透明度。
答案 1 :(得分:1)
经过一番发现,我找到了正确的答案。这令人失望。
无法在RGBA格式的透明图像上绘制亚像素渲染图形(包括字体)。
为了正确渲染此类图形,必须使用支持每种颜色的单独Alpha通道的格式。
例如每像素48位:RrGgBg其中r,g和b分别是红色,绿色和蓝色collor通道的alpha通道。