2011-04-27 52 views
4

獲取原始數據我有一個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)); 
    } 
} 

我不很喜歡,但它似乎喜歡做這樣的事情的最簡便方法。

顯示的是從位返回的數據()看起來是這樣的:

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

由於它看起來像雪 - 沒有像原始芯片 – Derek 2011-04-27 21:55:58

+1

你如何「顯示」從bits()返回的數據? – 2011-04-27 22:22:33

+0

編輯添加顯示代碼。但是,這不完全是我想要對數據做的事情......我正在嘗試將數據發送到第三方函數,該函數將使用數據作爲輸入並返回一個不同的unsigned char *數組,我知道如何顯示數據。 – Derek 2011-04-27 23:06:05

回答

8

當與原始圖像數據處理,你需要知道的一些基本問題:

  • 什麼是像素 數據的格式和佈局。從 QPixmap轉換的QImage不一定總是在 RGB888或RGB32。請致電 QImage :: format()與 處理不同的佈局。 特別是對於RGB32系列,您需要確保您以 右字節順序(endian)訪問它們。

  • 這些字節並非總是佈局 恰好是許多字節來保存線條的 像素。通常情況下,行 將具有比它需要的 更多的字節。使用QImage :: bytesPerLine()到 找到並提前 指針,當去 下一行時,許多字節。這可能是您的問題 在建立顯示圖像。

  • QImage :: pixel()和setPixel()是 真的很慢。如果可能,從原始像素緩衝區獲取/設置像素值 。

+0

感謝您提供每行字節的提示。這似乎是它的問題。 – Derek 2011-04-28 19:23:46

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擁有像素值的列表。