QImage::Format_mono to .png and QGraphicsScene
QImage::Format_mono to .png and QGraphicsScene
我创建了一个QImage
,格式为QImage::Format_Mono
。当我尝试通过QGraphicsScene
将图像显示给QGraphicsView
时,视图不变。QImage
通过QPixmap::fromImage()
函数生成的QPixmap
加载到场景中。我还尝试使用保存功能将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/视图显示适当。
如何更新代码以在QGraphicsView
中显示QImage
?
错误是Qt::GlobalColor
s(如Qt::white
或Qt::color0
)类型为QColor
,而不是预期的QRgb
。(QRgb
是unsigned int的类型定义)
可以使用QColor::rgb()
方法将QColor
转换为QRgb
,也可以使用全局方法qRgb(r,g,b)
直接创建QRgb
。下面是一个完整的工作示例来说明,它显示(并保存为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();
}
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 在CToolBar对象中使用PNG时出现问题
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- Gurobi GRBModel and GRBmodel in C++
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- QImage::Format_mono to .png and QGraphicsScene