QImage::Format_mono 到 .png 和 QGraphicsScene
Posted
技术标签:
【中文标题】QImage::Format_mono 到 .png 和 QGraphicsScene【英文标题】:QImage::Format_mono to .png and QGraphicsScene 【发布时间】:2013-06-18 15:57:08 【问题描述】:我创建了一个格式为QImage::Format_Mono
的QImage
。当我尝试通过QGraphicsScene
将图像显示到QGraphicsView
时,视图没有改变。使用通过QPixmap::fromImage()
函数生成的QPixmap
将QImage
加载到场景中。我还尝试使用保存功能将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 会正确显示。
如何更新我的代码以在QGraphicsView
中显示QImage
?
【问题讨论】:
顺便说一句,我猜view.setScene(scene);
只是 SO 中的一个错字,而不是你的代码。
【参考方案1】:
错误是Qt::GlobalColor
s(例如Qt::white
或Qt::color0
)的类型为QColor
,而不是预期的QRgb
。 (QRgb
是 unsigned int 的 typedef)
您可以使用QColor::rgb()
方法将QColor
转换为QRgb
,或者使用全局方法qRgb(r,g,b)
直接创建QRgb
。以下是一个完整的工作示例来说明,无论mono
是true
还是false
,都会显示(并保存为PNG)非常精确的图像。
#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();
【讨论】:
你是对的。我发现问题在于我使用的是 Qt 全局颜色,即Qt::white
和 Qt::color0
。我必须使用 QColor(Qt::white).rgb()
转换这些值,才能按预期运行。以上是关于QImage::Format_mono 到 .png 和 QGraphicsScene的主要内容,如果未能解决你的问题,请参考以下文章