Определите, какие пиксели QImage были изменены при рисовании на нем с помощью QPainter.

У меня есть класс Paintable, который может рисовать себя с помощью QPainter в качестве аргумента:

class Paintable
{
public:
    virtual void paint(QPainter*) = 0;
};

Экземпляры этого класса рисуются на одном QImage:

QImage paint(const std::vector<Paintable*>& paintables) {
    QImage result;
    QPainter p(&result);
    for(int i = 0; i < paintables.size(); ++i) {
        paintables[i]->paint(&p);
    }
    return result;
}

Чего я хочу добиться, так это того, чтобы функция paint также могла формировать матрицу размера, равного result размеру изображения, в которой каждая ячейка содержит указатель на Paintable, который нарисовал соответствующий пиксель в result изображении (что-то вроде z-буфера).

Этого можно было бы легко достичь, если бы методы отрисовки QPainter каким-то образом сообщали мне, какие пиксели QPaintDevice были изменены во время последней операции отрисовки. Любые идеи о том, как это сделать? Должен ли я создать класс, производный от QPaintDevice или QPaintEngine?

Я использую Qt 4.6.4.

Спасибо.


person Oleg Andriyanov    schedule 12.03.2014    source источник


Ответы (1)


Возможно, вместо того, чтобы все ваши Paintables рисовали на одном и том же QImage, пусть каждый рисует на временном пустом QImage, то есть QImage со всеми пикселями, установленными в RGBA=(0,0,0,0). Таким образом, после возврата метода paint() данного Paintable вы знаете, что любые пиксели в QImage, которые теперь непрозрачны, должны быть окрашены этим объектом Paintable. Затем вы можете обновить свой собственный z-буфер, например структуру данных, на основе этой информации, а затем нарисовать QImage () в отдельное «накопление QImage» (при условии, что вам также нужен составной результат), снова очистить временный QImage и повторять по мере необходимости.

person Jeremy Friesner    schedule 13.03.2014
comment
Это тоже первая идея, которая пришла мне в голову. Но я предполагаю, что такое решение даст огромные накладные расходы. Для результирующего изображения с высоким разрешением анализ каждого временного изображения может занять много времени. Но если бы QPainter или QImage могли предоставить немного больше информации о рисовании с ними/на них, не было бы накладных расходов. - person Oleg Andriyanov; 13.03.2014
comment
Если вы можете назначить каждому Paintable свой собственный уникальный цвет и гарантировать, что он будет рисовать только этим одним цветом, тогда вы можете заставить их всех рисовать в один и тот же QImage и использовать карту QColor->Paintable в конце, чтобы получить ваши результаты из пиксели... не знаю, разумное ли это ограничение. - person Jeremy Friesner; 13.03.2014
comment
... также, если вам нужно несколько цветов, вы можете сделать два прохода; один для рисования z-буфера одним цветом для каждого Paintable (как описано в предыдущем комментарии), а затем второй проход ко второму QImage с включенными фактическими цветами. - person Jeremy Friesner; 13.03.2014