我想创建一个QPixmap并使用QPainter进行绘制。这个QPixmap应该支持透明度,而不需要使用预乘的颜色通道。
目前,我会通过创建一个具有所需尺寸的QPixmap,并用每个通道(包括alpha)设置为零的QColor填充来实现这一点。
这将为QPixmap添加透明度。然而,如果我使用QPainter绘制到QPixmap上,绘制的颜色值会被源的alpha值预乘。我不想这样做,因为稍后QPixmap将作为纹理在QGLWidget中使用,并且在渲染时,QPixmap的alpha通道(现在是使用QPainter绘制的源的alpha)再次与颜色通道相乘,从而使alpha乘以两倍。
如果我在QPixmap的位置使用格式为QtGui.QImage.Format_ARGB32的QImage,则颜色通道不会被预乘,而alpha仅应用一次。但是,在渲染期间,这太慢了。我尝试使用上述格式在QImages上进行绘制,然后转换为QPixmaps,但得到了相同的结果(预乘的颜色通道再次与alpha通道相乘)。 Trolltech文档说:
根据系统的不同,QPixmap使用RGB32或预乘alpha格式存储。如果图像具有alpha通道,并且系统允许,则首选格式为预乘alpha。
我正在使用X(Linux)。是否有任何方法可以强制QPixmap在具有alpha通道的情况下不预乘颜色通道?
目前,我会通过创建一个具有所需尺寸的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)再次与颜色通道相乘,从而使alpha乘以两倍。
如果我在QPixmap的位置使用格式为QtGui.QImage.Format_ARGB32的QImage,则颜色通道不会被预乘,而alpha仅应用一次。但是,在渲染期间,这太慢了。我尝试使用上述格式在QImages上进行绘制,然后转换为QPixmaps,但得到了相同的结果(预乘的颜色通道再次与alpha通道相乘)。 Trolltech文档说:
根据系统的不同,QPixmap使用RGB32或预乘alpha格式存储。如果图像具有alpha通道,并且系统允许,则首选格式为预乘alpha。
我正在使用X(Linux)。是否有任何方法可以强制QPixmap在具有alpha通道的情况下不预乘颜色通道?