2010-07-31 58 views
5

Tôi có một mảng nổi đại diện cho Hình ảnh. (Cột đầu tiên). Tôi muốn hiển thị hình ảnh trên QGraphicsSecene dưới dạng QPixmap. Để làm điều đó tôi đã cố gắng tạo một hình ảnh mới từ mảng của tôi với hàm tạo QImage - QImage (dữ liệu const uchar *, int width, int height, Format format). đầu tiên tôi tạo ra một char unsigned mới và đúc mỗi giá trị từ mảng ban đầu của tôi để mới một char unsigned, và sau đó cố gắng để tạo ra một hình ảnh mới với đoạn mã sau:cách tạo một QImage mới từ một mảng nổi

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

Vấn đề là khi tôi cố gắng truy cập thông tin theo cách sau:

bcg-> pixel (i, j);

Tôi chỉ nhận được giá trị 12345. Tôi làm cách nào để tạo hình ảnh có thể xem từ mảng của mình. Cảm ơn

+0

bạn có thể hiển thị float -> uchar chuyển đổi? – strager

+0

Và dữ liệu gốc đại diện cho điều gì? Là mỗi float 0..1 đại diện cho black..white? Có kênh màu hay chỉ màu xám? – strager

+1

Không cần tạo QImage trên heap, btw. Nó được chia sẻ hoàn toàn (copy-on-write). –

Trả lời

4

Có hai vấn đề ở đây.

Một, hãy đúc float thành char chỉ cần làm tròn float, vì vậy 0,3 có thể được làm tròn thành 0 và 0,9 có thể được làm tròn thành 1. Đối với một loạt các 0..1, các char sẽ chỉ chứa 0 hoặc 1.

Để cung cấp cho các char đầy đủ, sử dụng một nhân: (. Ngoài ra, dàn diễn viên của mình không đúng)

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

Vấn đề khác là QImage::Format của bạn không chính xác; Format_Mono mong đợi 1BPP bitpacked dữ liệu, không phải 8BPP như bạn mong đợi. Có hai cách để giải quyết vấn đề này:

// 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, cảm ơn câu trả lời nhưng câu trả lời thứ hai của bạn không biên dịch. không có hàm tạo nào cho QImage nhận được QByteArray. Vì vậy, tôi đã thay đổi nó thành như sau: unsigned char * c_data = new unsigned char [fres.length() * 4]; cho (int i = 0, j = 0; i

+0

@boaz shor, Xin lỗi vì nó không biên dịch; gọi '.constData()' trên 'dữ liệu' sẽ sửa lỗi đó. Tôi không chắc điều gì khác có thể là vấn đề; bạn đã thử phiên bản được lập chỉ mục (thang độ xám) chưa? – strager

Các vấn đề liên quan