2010-01-19 186 views
11

我正在構建一個QT GUI應用程序並使用QImage打開圖像。 我的問題是,我無法弄清楚如何使用QImage的bit()和scanline()方法在每個像素級別獲取訪問權限。QT QImage像素操作

我看到這個帖子Qt QImage pixel manipulation problems 但這隻適用於每一行的第一個像素。這是正確的還是我弄錯了?

由於事先

+0

oopps!抱歉! 發佈問題後,我發現它在QT論壇http://qt.nokia.com/doc/qq/qq17-imageio.html 和答案是: for(quint32 y = 0; y theosem 2010-01-19 16:41:28

回答

13

scanlines對應於圖像的高度,列對應於圖像的寬度。

根據文檔,原型看起來像uchar* QImage::scanline(int i)或類似的const版本。

但是,作爲一個評論者指出的那樣,因爲數據是依賴於機器架構和形象,你應該直接使用uchar *。相反,使用類似以下內容:

QRgb *rowData = (QRgb*)img.scanLine(row); 
QRgb pixelData = rowData[col]; 
int red = qRed(pixelData); 
+11

-1:注意!由於這個答案出現在谷歌搜索甚至在官方Qt-API文檔之前,我認爲一個警告是適當的。您不能使用[行] [col]來訪問像素數據,因爲[col]會選擇一個uchar,並且像素數據將取決於每像素位格式。請參閱官方文檔中的警告:「不能直接使用uchar *指針,因爲像素格式取決於底層平臺上的字節順序。使用qRed(),qGreen(),qBlue()和qAlpha()來訪問像素「。 http://qt-project.org/doc/qt-4.8/qimage.html#scanLine – 2013-05-03 13:26:30

+1

我已更新答案,以反映正確的方式來訪問它。 – 2014-02-19 16:47:45

12

它可能不是從卡萊布的帖子立即明顯,但對於一個Format_RGB32圖像上設置像素以下工作。

// Get the line we want 
QRgb *line = (QRgb *)image->scanLine(row_index); 

// Go to the pixel we want 
line += col_index; 

// Actually set the pixel 
*line = qRgb(qRed(color), qGreen(color), qBlue(color)); 
0

答案並不適用於我。它看起來像,我的系統上的數據不是32位對齊。 要得到正確的數據,在我的系統上我必須這樣做:

for(uint32_t Y = 0; Y < mHeight; ++Y) 
{ 
    uint8_t* pPixel = Image.scanLine(Y); 

    for(uint32_t X = 0; X < mWidth; ++X) 
    { 
     const int Blue = *pPixel++; 
     const int Green = *pPixel++; 
     const int Red = *pPixel++; 

     uint8_t GrayscalePixel = (0.21f * Red) + (0.72f * Green) + (0.07 * Blue); 
    } 
}