QT QImage像素操作

14
我正在构建一个QT GUI应用程序,并使用QImage打开图像。 我的问题是,我无法弄清如何使用QImage的bit()和scanline()方法来访问每个像素级别。
我看到了这篇文章Qt QImage像素操作问题 但这仅适用于每行的第一个像素。这是正确的还是我搞错了?
提前致谢

翻译:oopps!! 抱歉!在发布问题后,我在QT论坛上找到了答案http://qt.nokia.com/doc/qq/qq17-imageio.html答案是:for (quint32 y = 0; y < h; ++y) { QRgb *scanLine = (QRgb *)img.scanLine(y); for (quint32 x = 0; x < w; ++x){ pix = qBlue(scanLine[x]); } } - theosem
3个回答

14

Scanlines 对应于图像的高度,而列则对应于图像的宽度。

根据文档,原型看起来像是 uchar* QImage::scanline(int i),或者一个类似的 const 版本。

但正如一位评论者指出的,由于数据依赖于机器架构和图像,因此不应直接使用 uchar *。相反,可以使用以下内容:

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

11
-1: 注意!由于这个答案在Google搜索中出现的早于官方Qt-API文档,因此我认为有必要提醒一下。你不能使用[row][col]来访问像素数据,因为[col]会选择一个uchar类型,而像素数据非常取决于每像素的位数格式。请参见官方文档中的警告:“您无法直接使用uchar*指针,因为像素格式取决于底层平台上的字节顺序。请使用qRed()、qGreen()、qBlue()和qAlpha()来访问像素。”http://qt-project.org/doc/qt-4.8/qimage.html#scanLine - Valentin H
1
我已经更新了答案以反映正确的访问方式。 - Kaleb Pederson

13

Kaleb的帖子可能不是立即显而易见的,但以下内容适用于在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);
    }
}

1
对齐方式取决于像素格式!这里有RGB888不对齐的像素格式 :) 始终将资源图像转换为您要使用的格式,例如RGBA32或ARGB32或类似格式。 - Петър Петров

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接