Почему в QImage после загрузки QByteArray вносит QImage(null)

После команды loadFromData должно превратится в картинку и показаться на екране, но нечего не происходит

QApplication::primaryScreen();
    if (!screen) {
        qDebug() << "Не удалось получить доступ к экрану!";
        return;
    }

    QPixmap screenshot = screen->grabWindow(0);

    QSize PicSize(1200, 1000);
    screenshot = screenshot.scaled(PicSize,Qt::KeepAspectRatio);

    QString fileName = "screenshot.png";
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "Не удалось открыть файл для записи!";
        return;
    }

    //qDebug() << QFileInfo(file).absoluteFilePath();

    screenshot.save(&file, "PNG");
    qDebug() << "Скриншот сохранен в файл" << fileName;
    QImage image = screenshot.toImage();

    //qDebug() << buffer.data().toBase64();

    //qDebug() << image;
    QByteArray screen_Data = QByteArray::fromRawData((const char*)image.bits(), image.sizeInBytes());

    QImage screenshot_img;

    screenshot_img.loadFromData(screen_Data);

    qDebug() << screenshot_img;

    ui->label->setPixmap(QPixmap::fromImage(screenshot_img));```

Ответы (1 шт):

Автор решения: needKVAS

loadFromData в вашем случае возвращает false т.к. передаваемые данные не соответствуют ни одному формату. image.bits() возвращает указатель на данные содержащие только пиксели. По одной этой информации невозможно восстановить изображение. Допустим, bits содержит информацию о 36 пикселях, как понять это изображение 6x6, 4x9 или 9x4?

Если вы хотите сохранить изображение в QByteArray и восстановить, можно использовать следующие варианты:

Через bits:

У QImage есть специальный конструктор, но ему нужно знать размер и формат данных.

QByteArray screen_Data = QByteArray::fromRawData(reinterpret_cast<const char*>(image.bits()), image.sizeInBytes());
int w = image.width();
int h = image.height();
QImage::Format f = image.format();
QImage screenshot_img = QImage(reinterpret_cast<const uchar*>( screen_Data.constData()), w, h, f).copy();

Данный конструктор QImage не копирует данные, поэтому обязательно нужно вызвать copy, чтобы данные оставались валидными после уничтожения screen_Data.

Через save:

Сохраняем в конкретном формате

QByteArray screen_Data;
QBuffer buffer(&screen_Data);
image.save(&buffer, "png");
QImage screenshot_img;
screenshot_img.loadFromData(screen_Data);
→ Ссылка