PyQt: создайте QPixmap с альфа-каналом, а не с предварительно умноженными цветовыми каналами.

Я хотел бы создать QPixmap для рисования с помощью QPainter. QPixmap должен поддерживать прозрачность без использования предварительно умноженных цветовых каналов.

В настоящее время я делаю это, создавая QPixmap с желаемыми размерами и заполняя его QColor, который был установлен на ноль для каждого канала (включая альфа-канал).

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

Это добавляет прозрачности QPixmap. Однако, если я рисую в QPixmap с помощью QPainter, нарисованные значения цвета предварительно умножаются на альфа-значение источника. Я не хочу этого, потому что QPixmap позже используется в качестве текстуры в QGLWidget и при рендеринге альфа-канала QPixmap (теперь альфа источника, который был нарисован с помощью QPainter) снова умножается на цветовые каналы, поэтому что альфа умножается дважды.

Если я использую QImage с форматом QtGui.QImage.Format_ARGB32 вместо QPixmap, то цветовые каналы не умножаются предварительно и альфа применяется только один раз. Однако это слишком медленно во время рендеринга. Я попытался нарисовать QImages в указанном выше формате, а затем преобразовать в QPixmaps, но получил тот же результат (предварительно умноженные цветовые каналы снова умножаются на альфа-канал). Документы Trolltech говорят,

В зависимости от системы QPixmap сохраняется с использованием формата RGB32 или предварительно умноженного альфа-канала. Если изображение имеет альфа-канал и если это позволяет система, предпочтительным форматом является альфа-канал с предварительным умножением.

Я использую X (Linux). Есть ли способ заставить QPixmap не умножать цветовые каналы, когда этот QPixmap имеет альфа-канал?


person bp45738    schedule 10.04.2011    source источник


Ответы (1)


В итоге я использовал QImages и оптимизировал свой код, минимизировав количество QGLWidget::bindTextures, которые я вызывал. Я до сих пор не получил удовлетворительного ответа о том, как предварительно умноженные QPixmaps можно использовать в качестве полупрозрачных текстур, но я доволен работой своей программы и больше не буду проверять эту тему.

person bp45738    schedule 28.04.2011