从QImage获取原始数据

时间:2011-04-27 21:42:26

标签: c++ qt qt4

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

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]));
    }

2 个答案:

答案 0 :(得分:9)

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

  • 像素的格式或布局是什么 数据。 QImage转换自 QPixmap不一定总是在 RGB888或RGB32。呼叫 QImage :: format()并处理 不同的布局不同。 特别是对于RGB32系列,你 需要确保你访问它们 右字节顺序(字节序)。

  • 字节并不总是布局 正是那么多字节来容纳 线的像素。通常是一条线 将拥有比它更多的字节 需要。使用QImage :: bytesPerLine()来 找出并推进指针 去的时候有很多字节 下一行。这可能是你的问题 在建立显示图像。

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

答案 1 :(得分: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包含像素值列表。