2010-07-31 52 views
5

我有一個表示圖像的浮點數組(第一列)。 我想將QGraphicsSecene上的圖像顯示爲QPixmap。爲了做到這一點,我試圖用QImage構造函數 - QImage(const uchar * data,int width,int height,Format format)從數組中創建一個新的圖像。 我首先創建一個新的無符號的字符和鑄造從我原來的數組新的無符號的字符每隔一個值,然後試着用下面的代碼創建一個新的形象:如何從浮點數組創建一個新的QImage

unsigned char * data = new unsigned char[fres.length()]; 
for (int i =0; i < fres.length();i++) 
    data[i] = char(fres.dataPtr()[i]); 

bcg = new QImage(data,fres.cols(),fres.rows(),1,QImage::Format_Mono); 

問題是,當我嘗試訪問該信息採用以下方式:

bcg-> pixel(i,j);

我只得到值12345. 如何從我的數組創建可視圖像。 謝謝

+0

你能告訴浮動 - > UCHAR轉換? – strager 2010-07-31 18:10:36

+0

原始數據代表什麼?每個浮動0..1代表黑色......白色?是否有色彩通道,還是隻是灰度? – strager 2010-08-01 12:37:28

+1

不需要在堆上創建QImage,順便說一句。它隱式共享(寫時複製)。 – 2010-08-01 12:43:37

回答

4

這裏有兩個問題。

一,鑄造floatchar簡單地舍入float,所以0.3可以是圓形的,以0和0.9可以是圓形的,以1。對於一系列的0..1時,char將只包含0或1。

爲了給焦炭品種齊全,使用乘法:(。另外,你的施法是不正確的)

data[i] = (unsigned char)(fres.dataPtr()[i] * 255); 

另一個問題是您的QImage::Format不正確; Format_Mono預計1BPP bitpacked數據,而不是你所期望的8BPP。有兩種方法來解決這個問題:

// Build a colour table of grayscale 
QByteArray data(fres.length()); 

for (int i = 0; i < fres.length(); ++i) { 
    data[i] = (unsigned char)(fres.dataPtr()[i] * 255); 
} 

QVector<QRgb> grayscale; 

for (int i = 0; i < 256; ++i) { 
    grayscale.append(qRgb(i, i, i)); 
} 

QImage image(data.constData(), fres.cols(), fres.rows(), QImage::Format_Index8); 
image.setColorTable(grayscale); 


// Use RGBA directly 
QByteArray data(fres.length() * 4); 

for (int i = 0, j = 0; i < fres.length(); ++i, j += 4) { 
    data[j] = data[j + 1] = data[j + 2] =   // R, G, B 
     (unsigned char)(fres.dataPtr()[i] * 255); 

    data[j + 4] = ~0;  // Alpha 
} 

QImage image(data.constData(), fres.cols(), fres.rows(), QImage::Format_ARGB32_Premultiplied); 
+1

HI, 感謝您的回覆,但您的第二個回覆無法編譯。 沒有接收QByteArray的QImage的構造函數。 所以我把它改爲: unsigned char * c_data = new unsigned char [fres.length()* 4]; (int i = 0,j = 0; i 2010-08-03 05:25:16

+0

@boaz紹爾,對不起,它不編譯;在'data'上調用'.constData()'應該可以解決這個問題。我不確定還有什麼可能是問題;你有沒有試過索引(灰度)版本? – strager 2010-08-05 15:53:10

相關問題