2010-01-19 188 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); 
    } 
}