从QImage获取原始数据

Der*_*rek 4 c++ qt qt4

我有一个我用pixmap构建的QImage,如下所示:

QPixmap fullPmap = topItem->pixmap();
fullPmap = fullPmap.copy(isec.toRect());
QImage chip = fullPmap.toImage();
Run Code Online (Sandbox Code Playgroud)

这基本上与屏幕上的矩形相交以将图像裁剪为切削尺寸.

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

我怎样才能做到这一点?

我试过这样的事情:

  unsigned char * data = chip.bits();
Run Code Online (Sandbox Code Playgroud)

当我显示"数据"时,我得到一个完全失真的图像,没有像我的实际芯片那样.

如果重要的话,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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢,但这似乎是做这种事情最简单的方法.

显示从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]));
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*Chu 9

处理原始图像数据时,您需要了解一些基本问题:

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

  • 字节并不总是精确地布局那么多字节来保存线的像素.通常,一行将具有比所需更多的字节.当转到下一行时,使用QImage :: bytesPerLine()来查找指针并将指针前移多少字节.这可能是构建显示图像的问题.

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