【问题标题】:Can't Store(Save) the QPainter Image无法存储(保存)QPainter 图像
【发布时间】:2019-01-07 11:37:03
【问题描述】:

我在 QPainter 的帮助下垂直组合了 2 个 QImage(“firstImage”和“secondImage”)。如屏幕截图所示,组合图像正确显示,没有错误:

Combined Image Displays Properly

First Image

Second Image

但是如果我想使用 .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(&amp;combinedImage);? QPainter 构造函数不采用 Qt 风格的父级,而是采用 QPaintDevice*。此构造函数开始绘制该设备。这意味着要么你应该QPainter paint(&amp;combinedImage);,然后你就不需要begin,或者你应该在没有设备的情况下构建:QPainter paint;。 2)我会用正确的尺寸构造combinedImage,然后绘制,这样drawImage就不需要调整大小。 (我不知道该功能是否如此可靠。)您尝试过吗?
  • 1) 我只是复制粘贴一些示例并进行一些试验。不是专家,我的代码不是很刻意。所以我根据你和通用汽车的 cmets 修复了初始化程序。 2)我这样做了,就像你和通用汽车一样。表示。谢谢

标签: c++ qt ubuntu qt5 qpainter


【解决方案1】:

考虑代码...

QPainter paint(this);
paint.begin(&combinedImage);

第一行本质上是……

QPainter paint;
paint.begin(this);

并使QPainterthis(您的MainWindow 实例)上处于活动状态。但是你有...

paint.begin(&combinedImage);

在已经激活的QPainter 上再次调用QPainter::begin。这可能是错误消息的来源......

QPainter::begin: Painter 已经激活

另外,你还使用默认的QImage构造函数初始化combinedImage...

QImage combinedImage;

此时combinedImage 是一个空图像——它没有与之关联的大小或格式,不能按原样使用。

要初始化和渲染combinedImage试试...

QImage combinedImage(std::max(firstImage.width(), secondImage.width()), /* Width */
                     firstImage.height() + secondImage.height(),        /* Height */
                     QImage::Format_ARGB32_Premultiplied);              /* Format */
{
    QPainter paint(&combinedImage);
    paint.drawImage(0, 0, firstImage);
    paint.drawImage(0, firstImage.height(), secondImage);
}

【讨论】:

  • 请注意,QPainter::begin 如果它得到一个空的QImage,则返回false,而如果使用constructor-begin,则无法检查此错误。如果 OP 检查了begin 的输出,毫无疑问,问题会很快得到解决。
  • 感谢您的帮助。我按照你说的做了修复。是的,我可以将 combinedImage-Copy.bmp 正确存储到硬盘中,但主窗口什么也不显示。如果解决了,一切都会迎刃而解
  • @SoajanII,QImage 与您的代码中的QMainWindow 没有关联。一个简单的选择是创建一个QLabel 并用它来可视化QImage。为此,请使用QLabel::setPixmap。您将需要使用QPixmap::fromImage。最后,将标签添加到QMainWindowsetCentralWidget。 Qt 有很好的文档,看看吧。
  • @G.M.我按照你所说的做了,这个也有帮助:stackoverflow.com/questions/25478186/…。非常感谢:)
猜你喜欢
  • 2018-08-17
  • 2012-06-03
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多