我建立一个QT GUI应用程序并使用QImage的用于打开图像。 我的问题是,我无法弄清楚如何使用的QImage的位()和扫描线() 方法,以获得在每个像素级别的访问。

我已经看到了这个帖子 Qt的QImage的像素操作的问题 但是这仅仅是每一行的第一个像素。这是正确的还是我理解错了?

由于事先

有帮助吗?

解决方案

scanlines 对应于图像的高度,列对应于所述图像的宽度。

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

但是,作为一个评论者指出的那样,因为数据是依赖于机器架构和图像,你应该不会直接使用uchar *。取而代之的是,使用类似下面的:

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

其他提示

它可能不是立即显而易见卡莱布的帖子,但以下作品要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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top