【发布时间】:2019-01-07 11:37:03
【问题描述】:
我在 QPainter 的帮助下垂直组合了 2 个 QImage(“firstImage”和“secondImage”)。如屏幕截图所示,组合图像正确显示,没有错误:
Combined Image Displays Properly
但是如果我想使用 .save 存储“combinedImage”,程序会停止并且我得到断言错误。
如何将合并后的图像存储到硬盘中?
主窗口.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QImage>
#include <QPaintEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent *)
{
QString firstImagePath = "/home/nvidia/Desktop/TestFolder/firstImage.jpg";
QString secondImagePath = "/home/nvidia/Desktop/TestFolder/secondImage.jpg";
QImage firstImage(firstImagePath);
QImage secondImage(secondImagePath);
QImage combinedImage;
QPainter paint(this);
paint.begin(&combinedImage);
paint.drawImage(0, 0, firstImage);
paint.drawImage(0, firstImage.height()*1.1, secondImage);
paint.end();
bool i = firstImage.save("/home/nvidia/Desktop/TestFolder/firstImage-Copy.bmp");
Q_ASSERT(i);
bool j = combinedImage.save("/home/nvidia/Desktop/TestFolder/combinedImage-Copy.bmp");
Q_ASSERT(j);
}
主窗口.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void paintEvent(QPaintEvent *);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
这是 Qt 输出:
Starting /home/nvidia/qtprojects/build-CombinedSave-Jetson_TX2-Debug/CombinedSave...
QPainter::begin: Painter already active
ASSERT: "j" in file ../CombinedSave/mainwindow.cpp, line 39
The program has unexpectedly finished.
/home/nvidia/qtprojects/build-CombinedSave-Jetson_TX2-Debug/CombinedSave crashed
firstImage-Copy.bmp 存储在 TestFolder 中,但 combinedImage-Copy.bmp 不是..
我的一些系统和程序属性:
ARMv8 Processor rev 3 (v8l) × 4 ARMv8 Processor rev 0 (v8l) × 2
Ubuntu 16.04 LTS
Qt Creator 3.5.1 Based on Qt 5.5.1 (GCC 5.2.1 20151129, 64 bit)
【问题讨论】:
-
几个小问题:1) 为什么你先
QPainter paint(this)然后paint.begin(&combinedImage);? QPainter 构造函数不采用 Qt 风格的父级,而是采用QPaintDevice*。此构造函数开始绘制该设备。这意味着要么你应该QPainter paint(&combinedImage);,然后你就不需要begin,或者你应该在没有设备的情况下构建:QPainter paint;。 2)我会用正确的尺寸构造combinedImage,然后绘制,这样drawImage就不需要调整大小。 (我不知道该功能是否如此可靠。)您尝试过吗? -
1) 我只是复制粘贴一些示例并进行一些试验。不是专家,我的代码不是很刻意。所以我根据你和通用汽车的 cmets 修复了初始化程序。 2)我这样做了,就像你和通用汽车一样。表示。谢谢
标签: c++ qt ubuntu qt5 qpainter