我正在构建一个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