开罗、ImageSurface:无法获得正确的alpha混合

3
我正在使用在Ubuntu 12.04上的pycairo(实际上是cairocffi)库。 系统上的库是cairo 1.10。 我创建了一个空的ImageSurface,并使用ARGB32格式。 例如,如果我尝试填充半透明白色矩形(RGBA(1,1,1,0.5)),我会看到一个半透明的灰色矩形。
对于在半透明背景上绘制的每个半透明像素,情况都是相同的:看起来cairo认为与透明像素混合与与黑色像素混合是相同的… 相同的问题也适用于在透明表面上绘制的抗锯齿形状:它们具有意外的暗色边界。
没有关于这种行为的参考,无处可查。所以我想知道,这是cairo的预期行为吗?如何解决这个问题?

你是如何查看绘图结果的?大多数显示器在显示透明度时会出现一些问题,"通常的方法"是使用黑色背景来解决这个问题。如果你想要一个白色(非透明)的背景,可以先绘制一个白色背景。或者在完成 DEST_OVER 操作后再绘制背景。 - Uli Schlachter
实际上,我在大约1小时前找到了答案,而这种不良行为在Cairo中是正常的。我会在回答中解释。 - Steve K
1个回答

2
我最终找到了cairo和不良alpha混合的问题所在。cairo支持ARGB32表面,但仅支持预乘alpha。也就是说,像素的每个分量都与alpha分量一起预乘存储。
我在互联网上没有找到答案,我认为预乘alpha不适用于我正在进行的操作类型。我切换到PyQt4,使用未预乘的ARGB32图像,效果非常好。
我还尝试使用PyQt4预乘alpha图像,并重现了该问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接