Не удается сохранить (сохранить) образ QPainter - PullRequest
0 голосов
/ 07 января 2019

Я комбинирую 2 QImages ("firstImage" и "secondImage") по вертикали с помощью QPainter. Объединенное изображение отображается правильно, без ошибок, как видно из снимка экрана:

Комбинированное изображение отображается правильно

Первое изображение

Второе изображение

Но если я хочу сохранить «комбинированный образ» с помощью .save, программа останавливается, и я получаю ошибку подтверждения.

Как сохранить объединенное изображение на жестком диске?

mainwindow.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);
}   

mainwindow.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, но сочетанииImage-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 Ответ

0 голосов
/ 07 января 2019

Рассмотрим код ...

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

Первая строка по существу ...

QPainter paint;
paint.begin(this);

и делает QPainter активным на this (ваш экземпляр MainWindow). Но тогда у вас есть ...

paint.begin(&combinedImage);

, который делает второй вызов QPainter::begin на уже активном QPainter. Это, вероятно, источник сообщения об ошибке ...

QPainter :: begin: Художник уже активен

Кроме того, вы также инициализируете combinedImage, используя конструктор QImage по умолчанию ...

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);
}
...