QImage: автоматическое определение формата при загрузке изображения

У меня есть изображение с расширением .jpg, но оно хранится в формате png. Когда я использую QImage для загрузки этого изображения, он возвращает недопустимый QImage:

QImage image (path);
if (image.isNull())
{
    //it enters here
}

Я должен проверить формат один за другим перед загрузкой изображения:

auto readImage = [](const QString & path)
{
    std::string formats[] = {
        "PNG",
        "JPG",
        "GIF",
        "JPEG",
    };

    for (auto && format : formats)
    {
        QImageReader img(path, format.c_str());
        if (img.canRead())
        {
            return QImage(path, format.c_str());
        }
    }
    return QImage(path);
};

QImage image = readImage(path);
if (image.isNull())
{
    //it does not enter here this time
}

Есть ли лучший способ загрузить изображение в неизвестном формате?

Обновите, используя метод load из QImage, все равно получите тот же результат:

QImage image;
image.load(path);
if (image.isNull())
{
    //it enters herer
 }

person pat    schedule 11.07.2018    source источник
comment
@eyllanesc, пожалуйста, внимательно прочитайте вопрос, прежде чем комментировать. В нынешнем методе нет ничего плохого. Но в будущем, если появится новый формат, я должен добавить его в список форматов. if (image.isNull()) конечно.   -  person pat    schedule 11.07.2018
comment
если есть новый формат, то вы должны создать плагин и встроить его в Qt.   -  person eyllanesc    schedule 11.07.2018
comment
Если есть новый формат изображения и Qt может его прочитать, вы должны быть в следующем списке:doc.qt.io/qt-5/qimagereader.html#supportedImageFormats   -  person eyllanesc    schedule 11.07.2018
comment
Нет, это должен быть doc.qt.io/qt-5/qimagereader. html#supportedImageFormats   -  person pat    schedule 11.07.2018
comment
Я уже исправил ссылку сразу после публикации, обновите страницу :)   -  person eyllanesc    schedule 11.07.2018


Ответы (1)


Я думаю, это то, что вам нужно (из документации QImage):

bool QImage::load(const QString &fileName, const char *format = nullptr) Загружает изображение из файла с заданным именем файла. Возвращает true, если изображение было успешно загружено; в противном случае делает изображение недействительным и возвращает false. Загрузчик пытается прочитать изображение в указанном формате, например PNG или JPG. Если формат не указан (это значение по умолчанию), он определяется автоматически на основе суффикса файла и заголовка. Дополнительные сведения см. в разделе {QImageReader::setAutoDetectImageFormat()}{QImageReader}.

Если нет, попробуйте посмотреть этот ответ, в котором упоминается вариант, что плагин jpeg отсутствует? может попробовать тот же самый эксперимент с файлом *.png?

person OrenIshShalom    schedule 11.07.2018
comment
должен быть этот документ (doc.qt.io/qt-5/qimage .html#QImage-8), но по-прежнему возвращает неверный QImage. Вот почему я должен вручную указать формат изображения - person pat; 11.07.2018
comment
@PhạmAnhTuấn Соответствует ли расширение файла формату изображения? Я имею в виду, что много раз в Интернете я загружал изображения с расширением jpg, которые на самом деле были png. - person eyllanesc; 11.07.2018
comment
Кажется, что конструкция отличается от операции загрузки ... вы пробовали обе? если да, не могли бы вы добавить попытку загрузки в свой пост? Спасибо! - person OrenIshShalom; 11.07.2018