Cairo,ImageSurface:无法正确获得 Alpha 混合
我在Ubuntu 12.04上使用pycairo(其实是cairocffi)。系统里的库是cairo 1.10。我创建了一个空的图像表面,格式是ARGB32。
比如说,我尝试填充一个半透明的白色矩形(RGBA(1,1,1,0.5)),结果却看到一个半透明的灰色矩形。
对于每一个在半透明背景上绘制的半透明像素都是这样:看起来cairo把和透明像素混合当成和黑色像素混合了……
同样的问题也出现在在透明表面上绘制的抗锯齿形状上:它们有意想不到的黑色边框。
关于这种行为没有任何参考资料,所以我在想,这真的是cairo的预期行为吗?我该怎么解决这个问题呢?
1 个回答
2
我终于找到了cairo和糟糕的透明混合问题的原因。cairo支持ARGB32格式的图像,但只支持预乘的透明度。也就是说,像素的每个颜色成分都是和透明度成分一起计算过的。
我在网上没有找到相关的答案,我觉得预乘透明度不适合我正在进行的操作。于是我换用了PyQt4,使用了没有预乘的ARGB32图像,结果一切都正常。
我还尝试了使用PyQt4的预乘透明度图像,结果又出现了同样的问题。