PyQt: создать QPixmap с альфа-каналом и без предварительно умноженных цветовых каналов - PullRequest
3 голосов
/ 11 апреля 2011

Я хотел бы создать 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 есть альфа-канал?

1 Ответ

0 голосов
/ 28 апреля 2011

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

...