我有一个我用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]));
}
答案 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包含像素值列表。