从QImage获取原始数据

4

我有一个QImage,类似于以下方式从一个pixmap构建:

QPixmap fullPmap = topItem->pixmap();
fullPmap = fullPmap.copy(isec.toRect());
QImage chip = fullPmap.toImage();

这基本上是在屏幕上与矩形相交,将图像裁剪为芯片尺寸。

现在我需要从芯片中获取表示该数据的字符数组。

我应该怎么做?

我尝试过类似于以下代码:

  unsigned char * data = chip.bits();

当我显示“数据”时,我得到的图像完全扭曲,与我的实际芯片完全不同。

如果fullPmap是RGB图像,则以下代码可将其转换为灰度图像:

QRgb col;
int gray;
for (int i = 0; i < chip.width(); ++i)
{
    for (int j = 0; j < chip.height(); ++j)
    {
        col = chip.pixel(i, j);
        gray = qGray(col);
        chip.setPixel(i, j, qRgb(gray, gray, gray));
    }
}

虽然我不太喜欢这种方法,但它似乎是实现这样一件事情最简单的方式。

从bits()返回的数据显示如下:

imwidth = chip.width();
imheight = chip.height();
QImage *qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
//  #pragma omp parallel for
for (int i = 0 ; i < imheight ; i++)
    for (int j = 0 ; j < imwidth ; j++)
    {
        qi->setPixel(j,i,qRgb(data[i*imwidth + j],data[i*imwidth + j],data[i*imwidth + j]));
    }

就像雪一样,与原始芯片完全不同。 - Derek
1
你如何“显示”从bits()返回的数据? - Stephen Chu
编辑以添加显示代码。然而,这并不是我想要处理数据的方式...我正在尝试将数据发送到一个第三方函数,该函数将使用数据作为输入并返回一个不同的unsigned char *数组,我知道如何显示它。 - Derek
2个回答

10

在处理原始图像数据时,需要注意一些基本问题:

  • 像素数据的格式或布局是什么。 从QPixmap转换的QImage不一定总是RGB888或RGB32格式。调用QImage :: format()并针对不同的布局进行处理。 特别是对于RGB32系列,您需要确保以正确的字节顺序(端点)访问它们。

  • 字节不总是准确地布置了每个线路的像素所需的那么多字节。 通常,一行将具有比所需更多的字节。 使用QImage :: bytesPerLine()找出并在进入下一行时将指针向前移动那么多字节。 这可能是您在构建显示图像时遇到的问题。

  • QImage :: pixel()和setPixel()非常慢。 如果可能,请从原始像素缓冲区获取/设置像素值。


感谢您提供每行字节数的提示。看起来那就是问题所在。 - Derek

0
这对我有用:
m_image =  new QImage(IMAGE_WIDTH,IMAGE_HEIGHT, QImage::Format_RGB32);
m_image->fill(Qt::white);
int rawDataCount = 0;
for (int y = 0;y<IMAGE_HEIGHT;y++)
{
    uint* line = (uint*)m_image->scanLine(y);
    for (int x=0;x<IMAGE_WIDTH;x++)
    {
        WORD temp = cameraZero[rawDataCount++];
        BYTE value = temp >> 2;
        QColor grey(value,value,value); 
        line[x] = qRgba(value,value,value,100);
    }
}

其中cameraZero保存了像素值列表。


"cameraZero" 在哪里声明的? (value,value,value) 会产生一种颜色? - NaturalDemon

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