Float

2010-07-31 36 views
5

'dan bir dizi yeni bir QImage nasıl oluşturulur Görüntüyü temsil eden bir dizi float var (ilk sütun). Görüntüyü QPraphicsSecene'de bir QPixmap olarak göstermek istiyorum. Bunu yapmak için QImage yapıcısı - QImage (const uchar * data, int width, int height, Format format) ile dizimden yeni bir görüntü oluşturmaya çalıştım. Ben öncelikle yeni unsigned char oluşturulan ve yeni işaretsiz karakter birine benim orijinal diziden her değeri döküm ve sonra aşağıdaki kodla yeni bir resim oluşturmaya çalıştınız: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); 

erişmeye çalıştığınızda sorun olduğunu Aşağıdaki şekilde bilgileri:

bcg-> piksel (i, j);

Yalnızca 12345 değerini alıyorum. Dizimden görüntülenebilir bir görüntüyü nasıl oluşturabilirim? Teşekkürler

+0

float gösterebilir -> dönüşüm UCHAR: Bu sorunu gidermek için iki yol vardır? – strager

+0

Orijinal veriler neyi temsil ediyor? Her bir float 0..1 siyahı temsil ediyor ... beyaz? Renk kanalları var mı yoksa sadece gri tonlamalı mı? – strager

+1

QImage'ı yığın üzerinde oluşturmanıza gerek yok, btw. Kesin olarak paylaşılıyor (üzerine yazma). –

cevap

4

Burada iki sorun var. Bir floatchar bir döküm

bir

, sadece çok 0.3 0 yuvarlanabilir ve 0.9 1 için yuvarlanabilir, float yuvarlar. 0..1 bir aralığı için, char sadece kullanmak, 0 veya

1. Char dizi vermek bir çarpma içerecektir: (. Ayrıca, dökme yanlış)

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

Diğer sorun, QImage::Format'unuzun hatalı olmasıdır; Format_Mono, beklediğiniz gibi 8BPP değil, 1BPP bitpacked verilerini bekler.

// 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, Cevabınız için teşekkürler, ancak ikinci cevabınız derlenmiyor. , QImage için bir QByteArray alan bir kurucu yoktur. Bu yüzden aşağıdaki gibi değiştirdim: imzasız char * c_data = yeni imzasız char [fres.length() * 4]; için (int i = 0, j = 0; i

+0

@boaz shor, Derlemediğim için üzgünüm; '.constData()' 'data' üzerinden çağrılması bunu düzeltmelidir. Sorunun başka ne olabileceğinden emin değilim; endeksli (gri tonlamalı) sürümü denediniz mi? – strager