для алгоритма постеризации. Мне нужно будет усреднить значения цвета (QRgb
) в моем std::vector
.Средние значения QRgb
Как вы бы хотели предложить?
Суммировать 3 компонента отдельно, тогда в среднем тогда? В противном случае ?
для алгоритма постеризации. Мне нужно будет усреднить значения цвета (QRgb
) в моем std::vector
.Средние значения QRgb
Как вы бы хотели предложить?
Суммировать 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();
Вот что я пытался. Я использовал long long для хранения сумм, поскольку я использовал значения [0-255] –