3

我想创建一个 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 或预乘 alpha 格式存储。如果图像具有 alpha 通道,并且系统允许,则首选格式是预乘 alpha。

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

4

1 回答 1

0

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

于 2011-04-28T01:14:51.793 回答