2010-07-31 16 views
5

Ho una matrice di float che rappresenta un'immagine (prima colonna). Voglio mostrare l'immagine su un QGraphicsSecene come QPixmap. Per farlo ho provato a creare una nuova immagine dal mio array con il costruttore QImage - QImage (const uchar * data, int width, int height, Format format). ho creato un nuovo unsigned char e colato ogni valore dalla mia matrice originale di nuovo char un unsigned, e poi ha cercato di creare una nuova immagine con il seguente codice:come creare un nuovo QImage da una serie di float

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

Il problema è quando si tenta di accedere le informazioni nel modo seguente:

bcg-> pixel (i, j);

Ricevo solo il valore 12345. Come posso creare un'immagine visibile dal mio array. Grazie

+0

si può mostrare il galleggiante -> uchar conversione? – strager

+0

E cosa rappresentano i dati originali? Ogni flottante 0..1 rappresenta il nero..white? Ci sono canali di colore o semplicemente in scala di grigi? – strager

+1

Non è necessario creare QImage sull'heap, btw. È implicitamente condiviso (copy-on-write). –

risposta

4

Ci sono due problemi qui.

unico, gettando una float ad un char arrotonda semplicemente il float, quindi 0.3 possono essere arrotondati a 0 e 0,9 possono essere arrotondati a 1. Per una serie di 0..1, l'char conterrà solo 0 o 1.

Per dare il char la gamma completa, utilizzare un moltiplicano: (. Inoltre, il cast era errato)

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

L'altro problema è che il tuo QImage::Format non è corretto; Format_Mono si aspetta 1BPP bitpacked dati, non 8BPP come previsto. Ci sono due modi per risolvere questo problema:

// 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, grazie per la risposta, ma la seconda risposta non viene compilata. non esiste un costruttore per QImage che riceve un QByteArray. Quindi l'ho modificato come segue: char senza segno * c_data = nuovo carattere senza segno [fres.length() * 4]; per (int i = 0, j = 0; i

+0

@boaz shor, mi dispiace che non venga compilato; chiamare '.constData()' su 'data' dovrebbe risolvere il problema. Non sono sicuro di quale altro potrebbe essere il problema; hai provato la versione indicizzata (scala di grigi)? – strager

Problemi correlati