PyQt:使用alpha通道而不是预乘颜色通道创建QPixmap

时间:2011-04-10 21:45:06

标签: qt pyqt transparency alpha qpixmap

我想创建一个QPixmap来使用QPainter进行绘制。 QPixmap应支持透明度,而不使用预乘颜色通道。

目前,我通过创建具有所需尺寸的QPixmap并使用为每个通道(包括alpha)设置为零的QColor填充它。

tex = QtGui.QPixmap(width, height)
c = QtGui.QColor(0)
c.setAlpha(0)
tex.fill(c)

这增加了QPixmap的透明度。但是,如果我使用QPainter绘制到QPixmap,则绘制的颜色值将乘以源的alpha值预乘。我不希望这样,因为QPixmap稍后用作QGLWidget中的纹理,并且渲染QPixmap的alpha通道(现在使用QPainter绘制的源的alpha)再次与颜色通道相乘,所以阿尔法乘以两次。

如果我使用格式为QtGui.QImage.Format_ARGB32的QImage代替QPixmap,则颜色通道不会预乘,并且alpha只应用一次。但是在渲染过程中这太慢了。我尝试使用上述格式绘制QImages,然后转换为QPixmaps,但得到相同的结果(预乘色彩通道再次乘以alpha通道)。奇趣科技的人说,

  

根据系统的不同,QPixmap是   使用RGB32或a存储   预乘alpha格式。如果   图像有一个alpha通道,如果有   系统允许,首选格式是   预乘alpha。

我正在使用X(Linux)。当QPixmap具有alpha通道时,有没有办法强制QPixmap不预乘颜色通道?

1 个答案:

答案 0 :(得分:0)

我最终使用QImages并通过最小化我调用的QGLWidget :: bindTextures的数量来优化我的代码。关于预乘QPixmaps如何用作半透明纹理,我仍然没有得到满意的答案,但我对我的程序性能感到满意,并且不再检查这个帖子了。