2012-01-17 5 views
2

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

Как вы бы хотели предложить?

Суммировать 3 компонента отдельно, тогда в среднем тогда? В противном случае ?

ответ

3

С QRgb - это всего лишь 32-битный беззнаковый int в формате 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(); 
+0

Вот что я пытался. Я использовал long long для хранения сумм, поскольку я использовал значения [0-255] –

Смежные вопросы