我正在構建一個QT GUI應用程序並使用QImage打開圖像。 我的問題是,我無法弄清楚如何使用QImage的bit()和scanline()方法在每個像素級別獲取訪問權限。QT QImage像素操作
我看到這個帖子Qt QImage pixel manipulation problems 但這隻適用於每一行的第一個像素。這是正確的還是我弄錯了?
由於事先
我正在構建一個QT GUI應用程序並使用QImage打開圖像。 我的問題是,我無法弄清楚如何使用QImage的bit()和scanline()方法在每個像素級別獲取訪問權限。QT QImage像素操作
我看到這個帖子Qt QImage pixel manipulation problems 但這隻適用於每一行的第一個像素。這是正確的還是我弄錯了?
由於事先
的scanlines
對應於圖像的高度,列對應於圖像的寬度。
根據文檔,原型看起來像uchar* QImage::scanline(int i)
或類似的const
版本。
但是,作爲一個評論者指出的那樣,因爲數據是依賴於機器架構和形象,你應該不直接使用uchar *
。相反,使用類似以下內容:
QRgb *rowData = (QRgb*)img.scanLine(row);
QRgb pixelData = rowData[col];
int red = qRed(pixelData);
-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
我已更新答案,以反映正確的方式來訪問它。 – 2014-02-19 16:47:45
它可能不是從卡萊布的帖子立即明顯,但對於一個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));
答案並不適用於我。它看起來像,我的系統上的數據不是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);
}
}
oopps!抱歉! 發佈問題後,我發現它在QT論壇http://qt.nokia.com/doc/qq/qq17-imageio.html 和答案是: for(quint32 y = 0; y
theosem
2010-01-19 16:41:28