Средние значения QRgb - PullRequest
3 голосов
/ 17 января 2012

Для алгоритма постеризации я должен усреднить значения цвета (QRgb), присутствующие в моем std::vector.

Как бы вы предложили это сделать?Суммируйте 3 компонента отдельно, затем усредните их?В противном случае?

1 Ответ

4 голосов
/ 17 января 2012

Поскольку QRgb - это просто 32-разрядное целое число без знака в формате ARGB, его недостаточно для добавления цветов, что, скорее всего, приведет к переполнению.Но также QColor недостаточно, поскольку в нем используются 16-разрядные целые числа с фиксированной запятой для цветовых компонентов, и поэтому они также не могут справляться с цветами вне допустимого диапазона [0,1].Таким образом, вы не можете использовать QRgb или QColor для этого, поскольку они ограничивают каждую частичную сумму допустимым диапазоном.Вы также не можете разделить цвета перед их добавлением из-за их ограниченной точности.

Таким образом, лучше всего было бы просто сложить отдельные компоненты с использованием чисел с плавающей запятой, а затем разделить их на размер вектора:

std::vector<QRgb> rgbValues;

float r = 0.0f, g = 0.0f, b = 0.0f, a = 0.0f;
for(std::vector<QRgb>::const_iterator iter=rgbValues.begin(); 
    iter!=rgbValues.end(); ++iter)
{
    QColor color(*iter);
    r += color.redF();
    g += color.greenF();
    b += color.blueF();
    a += color.alphaF();
}

float scale = 1.0f / float(rgbValues.size());
QRgb = QColor::fromRgbF(r*scale, g*scale, b*scale, a*scale).rgba(); 
...