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

发布于 2024-10-31 05:29:38 字数 832 浏览 2 评论 0原文

我想创建一个 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)时再次乘以颜色通道,所以alpha 乘以两次。

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

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

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

I would like to create a QPixmap to draw on using a QPainter. The QPixmap should support transparency without using premultiplied color channels.

Currently I do this by creating a QPixmap with the desired dimensions and filling it with a QColor that has been set to zero for each channel (including alpha).

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

This adds transparency to the QPixmap. However, if I draw to the QPixmap using a QPainter, the drawn color values are premultiplied by the alpha value of the source. I don't want this because the QPixmap is later used as a texture in a QGLWidget and upon rendering the alpha channel of the QPixmap (now the alpha of the source that was drawn using the QPainter) is again multiplied against the color channels, so that the alpha is multiplied twice.

If I use a QImage with format QtGui.QImage.Format_ARGB32 in place of the QPixmap, then the color channels are not premultiplied and the alpha is applied only once. However this is too slow during rendering. I have tried to draw on QImages with the above format and then convert to QPixmaps, but got the same result (premultiplied color channels again being multiplied by the alpha channel). The Trolltech docs say,

Depending on the system, QPixmap is
stored using a RGB32 or a
premultiplied alpha format. If the
image has an alpha channel, and if the
system allows, the preferred format is
premultiplied alpha.

I am using X (Linux). Is there any way to force a QPixmap to not premultiply the color channels when that QPixmap has an alpha channel?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟火散人牵绊 2024-11-07 05:29:38

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

I ended up using QImages and optimizing my code by minimizing the number of QGLWidget::bindTextures I was calling. I still have not received a satisfactory answer about how premultiplied QPixmaps can be used as semi-transparent textures, but I'm satisfied with my program performance and won't be checking this thread anymore.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文