Qt獲取一張圖片的平均色(主色調)

這兩天在一個小工具中想做一個圖標的發光效果,用固定顏色做出來效果很醜,於是想到此方法,得到圖標的主色調後,將顏色調亮,並設置為陰影顏色,從而達到類似發光的效果。

本文章主要在於得到一張圖片的平均色,並為其設置亮度變化。

先查看最終效果圖:

該程式先獲取圖片中平均色,再將窗口顏色設置為平均色,從而達到沉浸的效果。

具體實現

顏色是由RGB三元色構成的,red、green、blue每一項都是0-255的整數。

那麼,如果我們得到一些在圖片上均勻分布的點,再獲取他們的rgb值,分別求出平均數後最終得到的結果便是平均色。

先介紹一些Qt提供的方法

//該方法用於獲取Image圖片中位於(x,y)位置的點的rgb值
QRgb QImage::pixel(int x, int y)
//該方法用於判斷Image圖片中位於(x,y)位置的點是否有效
bool QImage::valid(int x, int y)

這兩個是這篇文章中必須用到的東西。

程式碼實現

QColor pixmapMainColor(QPixmap p, double bright) //p為目標圖片 bright為亮度係數,為1則表示保持不變
{
    int step=20; //步長:在圖片中取點時兩點之間的間隔,若為1,則取所有點,適當將此值調大有利於提高運行速度
    int t=0; //點數:記錄一共取了多少個點,用於做計算平均數的分母
    QImage image=p.toImage(); //將Pixmap類型轉為QImage類型
    int r=0,g=0,b=0; //三元色的值,分別用於記錄各個點的rgb值的和
    for (int i=0;i<p.width();i+=step) {
        for (int j=0;j<p.height();j+=step) {
            if(image.valid(i,j)){ //判斷該點是否有效
                t++; //點數加一
                QColor c=image.pixel(i,j); //獲取該點的顏色
                r+=c.red(); //將獲取到的各個顏色值分別累加到rgb三個變數中
                b+=c.blue();
                g+=c.green();
            }
        }
    }
        return QColor(int(bright*r/t)>255?255:int(bright*r/t),
                  int(bright*g/t)>255?255:int(bright*g/t),
                  int(bright*b/t)>255?255:int(bright*b/t)); //最後返回的值是亮度係數×平均數,若超出255則設置為255也就是最大值,防止乘與亮度係數後導致某些值大於255的情況。
}

在需要計算的位置調用此函數即可。