[英]Get raw data from QImage
我有一個從像素圖構建的 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]));
}
在處理原始圖像數據時,需要注意一些基本問題:
像素數據的格式或布局是什么。 從 QPixmap 轉換的 QImage 不一定總是 RGB888 或 RGB32。 調用 QImage::format() 並以不同的方式處理不同的布局。 特別是對於 RGB32 系列,您需要確保以正確的字節順序 (endian) 訪問它們。
字節並不總是完全布局那么多字節來保存行的像素。 通常,一行的字節數會比它需要的多。 轉到下一行時,使用 QImage::bytesPerLine() 找出指針並將指針前進那么多字節。 這可能是您在構建顯示圖像時遇到的問題。
QImage::pixel() 和 setPixel() 真的很慢。 如果可能,從原始像素緩沖區獲取/設置像素值。
這對我有用:
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 保存像素值列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.