2012-01-17 172 views
2

对于后置算法我需要对我的std::vector中存在的颜色值(QRgb)进行平均。平均QRgb值

你会建议如何做?

分别求和3个分量然后平均为?除此以外 ?

回答

3

由于QRgb只是一个ARGB格式的32位无符号整数,所以不能添加颜色,这很可能导致溢出。但是QColor也不足够,因为它使用定点16位整数作为颜色分量,因此也无法应付超出有效[0,1]范围的颜色。因此,您不能使用QRgbQColor,因为它们会将每个部分总和限制在有效范围内。由于精度有限,您在添加颜色前也不能细分颜色。

所以你最好的选择真的只是由矢量大小来总结使用浮点数的各个组件,然后将它们划分:

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

这就是我试过了。当我使用[0-255]的值时,我用了很长的时间来存储除数 – 2012-01-17 18:00:27