G
GUVadimJune 16, 2017, 7:45 a.m.

QImage не может определить тип изображения сделаного средствами JAVA

QImage, JPG, JAVA, SCALE, CONVERT

Собственно изображение (снимок на WEB-камеру через браузер средствами JAVA JCrop), который не может определить QImage.
Задумка была вставлять обрезанное изображение с оттенками серого в QLabel, но дальше обрезки дело не идёт.
На выходе QImage::format() полчую - 0 что говорит о неверном формате.
В обычных просмоторщиках изображений всё отлично и корректно.
В чём может быть загвоздка?
Сам код:

QImage img(importDataPath);
        qDebug() << "img.format() Foto" << img.format();
            // Грузим заново исправленный файл в QImage
            img.load(importDataPath);
        }
        // Скалируем размер
        img = img.scaled(736,160,Qt::IgnoreAspectRatio);
        // Делаем фото с оттенками серого, если оно не уже таковое
        if(img.format()!=24)
        img = img.convertToFormat(QImage::Format_Grayscale8);
        //сохраняем отскейленый файл
        if(img.save(importDataPath)){
            qDebug() << "save scaled SIGN "+importDataPath;
        }else{
            qDebug() << "NOT save scaled SIGN "+importDataPath;
            return;
        }

        QFile* file = new QFile(importDataPath);
        if(file->open(QIODevice::ReadOnly)){
            QByteArray  ba = file->readAll();
            base64sign = QString(ba.toBase64());
            QImage scaledImg;
            scaledImg.loadFromData(QByteArray::fromBase64(ba.toBase64()));
            signLb->setPixmap(QPixmap::fromImage(scaledImg));
            file->close();
        }else{
            qDebug() << "file is not opened SIGN (convert)";
        }
    }


Проблему решить можно через непосредственное открытие файла и изменение его типа...
Заранее спасибо за ответы.

photo.jpg
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

4
G
  • June 16, 2017, 7:52 a.m.

Как редактировать тему не нашёл... Вычёркиваем из кода строки 3-5.

    Evgenii Legotckoi
    • June 16, 2017, 11:48 a.m.

    Вот знаете... Похоже, что копать нужно в сторону JCrop, эта библиотека делает косячный файл. И проблема вовсе не в Qt и QImage. Я скачал файл и у меня стандартный просмоторщик изображений Linux выдал ошибку открытия вашего файла со ссылкой на отсутствие заголовочной информации о том, что это действительно JPEG формат.

    Мощные графические редакторы естественно могут определить формат правильно, там обрабатываются все эти ошибки и исключения, а QImage - это более примитивный вариант.
    Здесь может быть два варианта решения:
    1. Искать проблему в JCrop
    2. Либо писать код на стороне вашего C++ приложения, которое будет перепиливать заголовочную информацию на бинарном уровне.
    Из этих двух вариантов наиболее предпочтительным мне кажется разобраться с JCrop, либо заменить её на что-нибудь другое.
      G
      • June 20, 2017, 4:08 a.m.

      Да, я так же на JCrop грешу. JCrop ковырял, там заголовок пишется, но может он пишется коряво как-то...
      Если кому пригодится, то есть вариант ручного режима перепиливания заголовка.
      Вот:

      QImage img(importDataPath);
      
              qDebug() << "img.format() FOTO" << img.format();
              // Если формат файла не распознан, будем его распознавать руками...
              if(img.format()==0){
                  QFile* file = new QFile(importDataPath);
                  if(file->open(QIODevice::ReadWrite)){
                      QByteArray ba = file->readAll();
                      QImage GetImg;
                      // Не обозначаем формат файла при загрузке.
                      GetImg.loadFromData(QByteArray::fromBase64(ba.toBase64()));
      // Конвертируем GetImg = GetImg.convertToFormat(QImage::Format_RGB32);
      // Сохраняем if(GetImg.save(importDataPath,"JPG")){ qDebug() << "save convert JPG FOTO "+importDataPath; }else{ qDebug() << "NOT save convert JPG FOTO "+importDataPath; return; } file->close(); }else{ qDebug() << "file is not opened FOTO (convert)"; } // Грузим заново исправленный файл в QImage img.load(importDataPath); } // Скалируем размер img = img.scaled(320,400,Qt::IgnoreAspectRatio); // Делаем фото с оттенками серого, если оно не уже таковое if(img.format()!=24) img = img.convertToFormat(QImage::Format_Grayscale8); //сохраняем отскейленый файл if(img.save(importDataPath)){ qDebug() << "save scaled FOTO "+importDataPath; }else{ qDebug() << "NOT save scaled FOTO "+importDataPath; return; } // Вставляем фото в Qlabel QFile* file = new QFile(importDataPath); if(file->open(QIODevice::ReadOnly)){ QByteArray ba = file->readAll(); base64photo = QString(ba.toBase64()); qDebug() << "base64photo "+importDataPath << base64photo.size(); QImage scaledImg; scaledImg.loadFromData(QByteArray::fromBase64(ba.toBase64()),"JPG"); photoLb->setPixmap(QPixmap::fromImage(scaledImg)); saveDataBtn->setEnabled(true); file->close(); }else{ qDebug() << "file is not opened FOTO"; }
        G
        • June 20, 2017, 4:10 a.m.

        Спасибо за помощь Евгений!

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          Lz

          C ++ - Test 004. Pointers, Arrays and Loops

          • Result:70points,
          • Rating points1
          РК

          Qt - Test 001. Signals and slots

          • Result:84points,
          • Rating points4
          Last comments
          k
          kmssrFeb. 9, 2024, 12:43 a.m.
          Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
          Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
          EVA
          EVADec. 25, 2023, 4:30 p.m.
          Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
          J
          JonnyJoDec. 25, 2023, 2:38 p.m.
          Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
          G
          GvozdikDec. 19, 2023, 3:01 a.m.
          Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
          Now discuss on the forum
          BlinCT
          BlinCTJune 25, 2024, 7 a.m.
          Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
          Evgenii Legotckoi
          Evgenii LegotckoiJune 24, 2024, 9:11 p.m.
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          BlinCT
          BlinCTMay 5, 2024, 11:46 a.m.
          Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
          Evgenii Legotckoi
          Evgenii LegotckoiMay 2, 2024, 8:07 p.m.
          Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
          IscanderChe
          IscanderCheApril 30, 2024, 10:22 a.m.
          Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

          Follow us in social networks