2011-06-08 22 views
0

我正在從一段代碼,僅僅是訪問圖像座標意想不到的輸出,這裏有一個片段:Qt 4.7 QColor構造函數:可能的錯誤?

QImage image(imageFileNames[frameNumber]); 
QRgb qrgb(image.pixel(493,114)); 
QColor testCol(qrgb); 

使用調試,以確保我得到正確的圖像路徑我得到類似../seq/0001.png,這是如預期。然而,testCol具有的價值:

[argb] 
alpha 65535 
blue 28013 
green 24415 
pad 0 
red 59367 

取而代之的255,255,255範圍內的預期值。此外,qrb的值爲4293353325.像素座標位於圖像範圍內(720x288圖像),圖像位於.png格式(QImage::Format_RGB32)。

我也發現這個問題似乎是整個應用程序的全局問題,任何寫入的新代碼似乎都會繼承這種行爲。

在進一步的實驗,使用以下代碼:

QRgb qrgb(image.pixel(1,1)); //again this is in range 
int blue = qBlue(qrgb); 
int red = qRed(qrgb); 
int green = qGreen(qrgb); 
QColor testCol(red,green,blue, 255); 

testColor仍然具有錯誤的值。但是,紅色,綠色和藍色都顯示預期值。似乎這是QColor構造函數的問題?我並不太確定究竟發生了什麼。

任何想法可能會導致此行爲?我在Ubuntu 10.10上運行Qt 4.7。

+0

使用「代碼」按鈕來格式化代碼(縮進4個空格)。內聯代碼通過使用反引號完成:' – rubenvb 2011-06-08 13:40:31

+0

是您的tesCol QColor :: Rgb的cspec? – 2011-06-08 17:23:37

回答

0

QColor是不同結構的聯合。每個結構由5個無符號短褲組成。

QT使用內部位移來存儲RGB值。所以當你將藍色分量設爲「1」時,它將它轉換爲257.當你檢查一個QColor時,你的調試器會將你顯示爲藍色分量,你會感到驚訝!

另一方面,當你使用QColor的blue()方法時,你應該得到1!

不要使用調試器來檢查QColor使用其getter和setter方法。

這是一個取自QT code的示例。你可以清楚地看到位移。

QColor::QColor(QRgb color) 
{ 
    cspec = Rgb; 
    ct.argb.alpha = 0xffff; 
    ct.argb.red = qRed(color) * 0x101; 
    ct.argb.green = qGreen(color) * 0x101; 
    ct.argb.blue = qBlue(color) * 0x101; 
    ct.argb.pad = 0; 
} 
+0

遲到比從未好,這絕對是問題的原因。 – Mykyta 2012-04-13 15:02:28

0

QColor類(整數與浮點精度部分)的描述中,解釋了使用16位整數存儲顏色分量。因此RGBA值存儲在0-65535的範圍內。所以也許代碼已經發展,現在返回一個16位整數而不是8位。

我現在無法測試,但問題是:函數結果是錯誤的還是文檔錯誤?

您應該打開一個問題,將其指向Qt開發團隊。

+0

奇怪的是,我已經使用這個相同的代碼幾個月了,返回的整數值一直是8位。這些值DO對應於圖像像素值的16位等效值。這非常奇怪。 – Mykyta 2011-06-08 14:14:00

+0

也許嘗試在Qt的開發版本,還沒有在最終版本中恢復 – 2011-06-08 15:15:38