2013-06-18 2 views
1

Я создал QImage формата QImage::Format_Mono. Когда я пытаюсь показать изображение на QGraphicsView через QGraphicsScene, представление не изменится. QImage загружается на сцену, используя QPixmap, созданный с помощью функции QPixmap::fromImage(). Я также попытался сохранить QPixmap как PNG/JPG/BMP, используя функцию сохранения, а также безрезультатно. Основной код структура выглядит следующим образом:QImage :: Format_mono to .png и QGraphicsScene

QGraphicsView *view = new QGraphicsView(); 
QGraphicsScene *scene = new QGraphicsScene(); 
view.setScene(scene); 
QImage img(size,QImage::Format_Mono); 
QVector<QRgb> v; 
v.append(Qt::color0); // I have tried using black and white 
v.append(Qt::color1); // instead of color0 and 1 as well. 
img.setColorTable(v); 
// Do some stuff to populate the image using img.setPixel(c,r,bw) 
// where bw is an index either 0 or 1 and c and r are within bounds 
QPixmap p = QPixmap::fromImage(img); 
p.save("mono.png"); 
scene->addPixmap(p); 
// Code to display the view 

Если я вместо этого сделать изображение QImage::Format_RGB888 и заполнить пикселей с черным или белым PNG/вид отображает соответствующим образом.

Как я могу обновить свой код для отображения QImage в QGraphicsView?

+0

Кстати, я думаю, 'view.setScene (scene);' была просто опечаткой в ​​SO, а не в вашем коде. – Boris

ответ

3

Ошибка в том, что Qt::GlobalColor с (такие, как Qt::white или Qt::color0) имеют тип QColor, а не QRgb, как ожидалось. (QRgb является ЬурейиМ для неподписанных Int)

Вы можете преобразовать QColor к QRgb с помощью метода QColor::rgb(), или непосредственно создавать QRgb с использованием глобального метода qRgb(r,g,b). Ниже приведен полный рабочий пример для иллюстрации, который отображает (и сохраняет как PNG) очень точное изображение: mono - true или false.

#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsView> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 

    QGraphicsView *view = new QGraphicsView(); 
    QGraphicsScene *scene = new QGraphicsScene(); 
    view->setScene(scene); 

    int W = 100; 
    int H = 100; 
    QImage img; 
    uint color0 = qRgb(255,0,0); 
    uint color1 = Qt::green.rgb(); 
    bool mono = true; 
    if(mono) 
    { 
     img = QImage(QSize(W,H),QImage::Format_Mono); 
     QVector<QRgb> v; v << color0 << color1; 
     img.setColorTable(v); 
     for(int i=0; i<W; i++) 
     for(int j=0; j<H; j++) 
     { 
      uint index; 
      if(j-(j/10)*10 > 5) 
       index = 0; 
      else 
       index = 1; 
      img.setPixel(i,j,index); 
     } 
    } 
    else 
    { 
     img = QImage(QSize(W,H),QImage::Format_RGB888); 
     for(int i=0; i<W; i++) 
     for(int j=0; j<H; j++) 
     { 
      uint color; 
      if(j-(j/10)*10 > 5) 
       color = color0; 
      else 
       color = color1; 
      img.setPixel(i,j,color); 
     } 
    } 

    QPixmap p = QPixmap::fromImage(img); 
    p.save("mono.png"); 
    scene->addPixmap(p); 
    view->show(); 

    return app.exec(); 
} 
+0

Вы были правы. Я обнаружил, что проблема заключается в том, что я использовал глобальные цвета Qt, то есть «Qt :: white» и «Qt :: color0». Я должен был преобразовать эти значения, используя 'QColor (Qt :: white) .rgb()', чтобы он вел себя так, как ожидалось. – user29291

+0

Отлично :-) Я обновил свой ответ, чтобы сделать его более полезным. – Boris

Смежные вопросы