這兩天在一個小工具中想做一個圖示的發光效果,用固定顏色做出來效果很醜,於是想到此方法,得到圖示的主色調後,將顏色調亮,並設定為陰影顏色,從而達到類似發光的效果。
本文章主要在於得到一張圖片的平均色,併為其設定亮度變化。
先檢視最終效果圖:
該程式先獲取圖片中平均色,再將視窗顏色設定為平均色,從而達到沉浸的效果。
具體實現
顏色是由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的情況。
}
在需要計算的位置呼叫此函式即可。