2010-07-31 16 views
5

Mam tablicę wartości pływających reprezentującą obraz. (Kolumna pierwsza). Chcę pokazać obraz na QGraphicsSecene jako QPixmap. W tym celu próbowałem stworzyć nowy obraz z mojej tablicy za pomocą konstruktora QImage - QImage (const uchar * data, int width, int height, Format format). raz pierwszy stworzył nową unsigned char i lanego każdą wartość z mojej oryginalnej tablicy do nowego char bez znaku, a następnie próbował stworzyć nowy obraz z następującego kodu:Tworzenie nowego QImage z tablicy pływaków

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

Problem jest, gdy próbuję dostęp informacje w następujący sposób:

bcg-> pixel (i, j);

Otrzymuję tylko wartość 12345. Jak utworzyć obraz widoczny z mojej tablicy. Dzięki

+0

można pokazać pływak -> uchar konwersji? – strager

+0

Co reprezentują oryginalne dane? Czy każdy pływak 0..1 reprezentujący kolor czarny ... biały? Czy są kanały kolorów, czy jest to tylko skala szarości? – strager

+1

Nie trzeba tworzyć QImage na stercie, btw. Jest on nieodłącznie udostępniany (kopiowanie przy zapisie). –

Odpowiedz

4

Istnieją dwa problemy tutaj.

One odlewania float Do char prostu rundach float, więc mogą być zaokrąglone 0,3 0 0,9 mogą być zaokrąglone 1. Dla zakresu 0..1 The char będzie zawierać tylko 0 lub 1.

Aby dać char pełny zakres, należy użyć mnożenie (. Również Twój obsada była błędna)

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

Drugi problem polega na tym, że Twój QImage::Format jest niepoprawny; Format_Mono oczekuje 1BPP bitpacked danych, a nie 8BPP, jak się spodziewasz. Istnieją dwa sposoby, aby rozwiązać ten problem:

// 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, dzięki za odpowiedź, ale twoja druga odpowiedź nie kompiluje się. nie ma konstruktora dla QImage, który odbiera QByteArray. Zmieniłem go na: unsigned char * c_data = nowy unsigned char [fres.length() * 4]; dla (int i = 0, j = 0; i

+0

@boaz shor, Przepraszam, że się nie kompiluje; wywołanie '.constData()' na 'danych' powinno to naprawić. Nie jestem pewien, co jeszcze może być problemem; czy próbowałeś wersji indeksowanej (skali szarości)? – strager