Ошибка Gtk: фатальная ошибка чтения файла изображения PNG

Когда я запускаю свою программу и хочу загрузить в нее изображение, появляется окно выбора изображения, но вскоре после сбоя программы я получаю сообщение об ошибке: ## Заголовок ##

Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /usr/share/icons/Yaru/16x16/status/image-missing.png: Fatal error reading PNG image file: Invalid IHDR data (gdk-pixbuf-error-quark, 0)  
Bail out! Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load /usr/share/icons/Yaru/16x16/status/image-missing.png: Fatal error reading PNG image file: Invalid IHDR data (gdk-pixbuf-error-quark, 0)  
Aborted

Я пытался добавить unset GDK_PIXBUF_MODULEDIR и unset GDK_PIXBUF_MODULE_FILE к .bashrc, и это работало примерно 7 запусков программы, когда ошибка появилась снова. Потом я попробовал бежать sudo update-mime-database /usr/share/mime но ничего не изменилось. Кто-то упомянул, что запуск в режиме sudo решил проблему, но мне ничего не помогло. Хуже всего то, что иногда программа работает нормально. Я запускаю его несколько раз подряд, но ошибка не проявляется.
Редактировать: У меня есть простой графический интерфейс, созданный на Qt, с кнопкой и QGraphicsView, и вот фрагменты кода, которые могут быть полезны. Главное окно:

#include "mainwindow.h"
#include "./ui_mainwindow.h"

#include <iostream>
#include <QFileDialog>
#include <QMessageBox>
#include <QWidget>
#include <QTableWidget>
#include <QString>
#include <QCloseEvent>

#include "colorfilter.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setFixedSize(800, 600);
    ui->wHidden->hide();

    connect(ui->pbUploadImage, &QPushButton::clicked, this, &MainWindow::uploadImage);
    connect(ui->pbShowLayer, &QPushButton::clicked, this, &MainWindow::exposeLayer);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::uploadImage()
{
    if (ui->imgView->scene())
        ui->imgView->scene()->clear();

    this->m_fName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home", tr("Image Files (*.png *.jpg *.bmp)"));
    if (this->m_fName.isEmpty())
        return;

    QPixmap pMap(this->m_fName);

    if (! ui->imgView->scene()) {
        qDebug() << "No Scene!";

        QGraphicsScene *scene = new QGraphicsScene(this);
        ui->imgView->setScene(scene);
    }

    ui->imgView->scene()->addPixmap(pMap);
    std::cout << m_fName .toStdString()<< std::endl;

}

void MainWindow::exposeLayer()
{
    if (this->m_fName.size() == 0){
        MainWindow::showMessage(this, "Please sellect an image first");
        return;
    }
    ColorFilter::Layer layer = ColorFilter::toLayer(ui->cbColor->currentText());
    auto cf = new ColorFilter(this->m_fName, layer);
    std::vector<QImage> images = cf->getImages();

    ui->wHidden->setVisible(true);
    QPixmap pMap(QPixmap::fromImage(images[0]));

    if (!ui->imgView->scene()){
        qDebug() << "No Scene!";

        QGraphicsScene *scene = new QGraphicsScene(this);
        ui->imgView->setScene(scene);
    }
    ui->imgView->scene()->addPixmap(pMap);
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    for(auto w : this->openedWindows)
        w->close();
    event->accept();
}

void MainWindow::showMessage(QWidget *parent, QString message)
{
    QMessageBox *noData = new QMessageBox(parent);
    noData->setText(message);
    noData->show();
}

цветной фильтр:

#include "colorfilter.h"

#include <iostream>
#include <vector>
#include <QString>
#include <QDebug>
#include <QWidget>
#include <QLabel>

#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"

ColorFilter::ColorFilter(QString &fName, ColorFilter::Layer layer):
    m_fName{fName}, m_layer{layer}
{}

std::vector<QImage> ColorFilter::getImages()
{
    cv::Mat image = cv::imread(this->m_fName.toStdString(), cv::IMREAD_COLOR);
    if (image.empty())
        qDebug() << "No image";
    std::vector<cv::Mat> newImages;
    if (this->m_layer == ColorFilter::Layer::SUPER)
        newImages = this->superImage(image);
    // else if (this->m_layer == ColorFilter::Layer::RED)
    //     newImages = this->superImage()

    std::vector<QImage> result;
    for(auto &im : newImages)
        result.push_back(this->cvMatToQImage(im));

    return result;
}

ColorFilter::Layer ColorFilter::toLayer(const QString &layer)
{
    std::unordered_map<QString, Layer> toLayer = {
        {"red", ColorFilter::Layer::RED},
        {"blue", ColorFilter::Layer::BLUE},
        {"green", ColorFilter::Layer::GREEN},
        {"superimposed", ColorFilter::Layer::SUPER}
    };
    auto it = toLayer.find(layer);
    if (it != toLayer.end())
        return it->second;
    return ColorFilter::Layer::UNDEFINED;
}

std::vector<cv::Mat> ColorFilter::superImage(const cv::Mat &image)
{
    std::vector<cv::Mat> alteredImages;
    cv::Mat tmp;

    for(int i = 0; i < 8; i++){
        tmp = image.clone();
        for(int n = 0; n < tmp.rows; n++)
        {
            cv::Vec3b *row = tmp.ptr<cv::Vec3b>(n);
            for(int m = 0; m < tmp.cols; m++){
                cv::Vec3b &pixel = row[m];
                // pixel[i] is uchar to represent values between 0 and 255
                tmp.ptr<cv::Vec3b>(n)[m][0] = (uchar)(((((int)pixel[0]) >> i) & 1)*255);
                tmp.ptr<cv::Vec3b>(n)[m][1] = (uchar)(((((int)pixel[1]) >> i) & 1)*255);
                tmp.ptr<cv::Vec3b>(n)[m][2] = (uchar)(((((int)pixel[2]) >> i) & 1)*255);
            }
        }
        alteredImages.push_back(tmp);
    }
    return alteredImages;
}

QImage ColorFilter::cvMatToQImage(const cv::Mat &image)
{
    if (image.type() == CV_8UC1) {
        // Grayscale image
        return QImage(image.data, image.cols, image.rows, image.step, QImage::Format_Grayscale8);
    } else if (image.type() == CV_8UC3) {
        // 3-channel color image (BGR format)
        // cv stores images in BGR format, but QImage expects RGB, that's why it it swapped
        return QImage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888).rgbSwapped();
    } else {
        qDebug() << "Unsupported cv::Mat format for QImage conversion";
        return QImage();
    }

}

Не могли бы вы привести минимальный и воспроизводимый пример?

BobMorane 13.08.2024 14:33

Я видел ваше редактирование. Я предлагаю вам создать пример программы, воспроизводящей вашу проблему, но минимальной (минимальное количество для воспроизведения). В большинстве случаев решение находится при создании этого примера кода. Если вы все еще не нашли решение, вы можете опубликовать здесь свой минимальный пример, чтобы другие могли попробовать его дома. На данный момент мы не можем опробовать ваш код.

BobMorane 13.08.2024 15:35

Просто наличие строки cv::Mat image = cv::imread(this->m_fName.toStdString(), cv::IMREAD_COLOR); вызывает ошибку, я даже не вызываю содержащую ее функцию. Может ли это быть связано с библиотекой opencv?

Marijam 14.08.2024 11:07

Я бы посоветовал вам удалить «Решено» из заголовка, ответить на свой вопрос и принять его. Что касается вашего второго вопроса, я бы предложил опубликовать новый вопрос об этой конкретной проблеме. У вас будет больше шансов получить ответ.

BobMorane 15.08.2024 17:46

Если с Конаном возникла конкретная проблема, лучше всего сообщить об этом по адресу github.com/conan-io/conan/issues, чтобы получить официальную поддержку от сопровождающих.

drodri 16.08.2024 09:40

Это вопрос-ответ, возможно, вы захотите отправиться на экскурсию. Пожалуйста, не добавляйте «Решено» к заголовку и решению в текст вопроса. Если у вас есть ответ на ваш вопрос, опубликуйте его как ответ. Я откатил ваше последнее редактирование, так как это не относится к вопросу.

Dan Mašek 16.08.2024 20:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема была в установке библиотеки opencv, после установки вручную ошибки ali исчезли.

Другие вопросы по теме