QImage :: Format_mono to .png и QGraphicsScene

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

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 / View отображался соответствующим образом.

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

1

Решение

Ошибка в том, что Qt::GlobalColors (например, Qt::white или же Qt::color0) имеют тип QColor, и не QRgb как и ожидалось. (QRgb является typedef для неподписанного типа 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();
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]