V
July 26, 2016, 4:37 a.m.

EXIF данные изображений

EXIF, QImage

Приветствую. Есть известная проблема: при сохранении QImage в файл он не сохраняет EXIF данные. Долго думал и искал, в результате остановился на QImageExifHeader. Штука эта очень удобная и работает. НО, работает со всеми изображениями, кроме тех, которые сохранены QImage. Они получаются битыми и нечитаемыми, испорчены. При этом если редактировать теги других файлов (не сохраненных через QImage, а полученных из других источников), то все нормально работает.
Что делать? Какой выход?
Заранее спасибо.
0

Do you like it? Share on social networks!

10
Evgenii Legotckoi
  • July 26, 2016, 10:41 a.m.
Добрый день.
Полагаю, что нужно использовать сторонние библиотеки. Например, libpng или libjpeg.
Например, забрать полезную нагрузку из QImage и сохранить через обычный FILE с использованием ligpng или libjpeg.
Полагаю, что таким образом можно будет обойти проблему с QImage, но это по сути пересохранение изображения, только другими средствами.
Ну и нужно поискать информацию по поддержке EXIF этими сторонними библиотеками.
    V
    • July 26, 2016, 2:12 p.m.
    Пробовал libexif, не канает. Libexif требует для своей работы несжатый буфер изображения, а компрессия и сохранение происходит через libjpeg. Это ужасно медленно работает.
      Evgenii Legotckoi
      • July 26, 2016, 3:12 p.m.
      EXIF – это же заголовочные данные? Само же изображение вроде там не изменяется.
      Как вариант, свой велосипед, который будет модифицировать заголовок.
      То есть проанализировать файл после QImage, и попытаться добавить недостающие данные.
        V
        • July 26, 2016, 4:39 p.m.
        На разбирательство со стандартом EXIF уйдет много времени, а меня интересует результат а не процесс. Да, это заголовок и данных изображения это не касается, но QImage, как я понял, оставляет мало места для тегов, поэтому, когда QExifImageHeader пытается дописать теги он не находит куда их записать и портит изображение, записав их куда попало. В итоге теги записаны нормально и читаются, но вот увидеть само изображение уже невозможно.
          Evgenii Legotckoi
          • July 26, 2016, 5:14 p.m.
          А есть готовый тестовый мини-пример c этим QImageExifHeader? Можешь прикрепить его в топик?
          В QImage также присутствует метод setText(const QString &key, const QString &text), который может быть использован для добавления текстовой информации. Стоит посмотреть его работу.
          Также, попробовать расширить заголовок, сдвинув полезную нагрузку, прежде чем записывать EXIF данные.
            V
            • July 26, 2016, 8:30 p.m.

            Вот код:

            #include <QtGui/QApplication>
            #include <QWidget>
            #include "qexifimageheader.h"
            #include <QTimer>
             
            int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
             
                QExifImageHeader exif1("1.jpg");
                exif1.saveToJpeg("2.jpg");
             
             
                QWidget widget;
                widget.show();
             
                QTimer::singleShot(200, &a, SLOT(quit()));
                
                return a.exec();
            }

            Прикрепляю ссылку на файлы h/cpp и тестовые изображения. 1.jpg получено с камеры телефона, а 2.jpg пересохранено с помощью QImage. При попытке переноса тегов из 1.jpg в 2.jpg второе изображение становится поврежденным. При таких же действиях над изображениями, полученными не с помощью QImage — все работает нормально.
            Ссылка

              Evgenii Legotckoi
              • July 26, 2016, 8:49 p.m.
              А под какой версией Qt это тестировалось?
                V
                • July 26, 2016, 8:50 p.m.
                Qt 4.8 и Qt 5.7.
                  Evgenii Legotckoi
                  • July 26, 2016, 11:54 p.m.
                  • The answer was marked as a solution.

                  Интересная проблема.
                  В файле, сохранённом с QImage, изначально отсутствует маркер и заголовок с EXIF.
                  В случае с обычными фотографиями, обработка идёт по одной ветке кода. И EXIF просто перезаписывается.
                  В случае же с QImage, обработка идёт по совершенно другой ветке кода.
                  Тогда всё изображение сдвигается вместе со своим изначальным заголовком и в начало вписывается копированный заголовок с EXIF. Также там до кучи накидываются ещё маркеры, которые даже не позволяют определить, с какого места записываются данные с EXIF. Во всяком случае обычный просмоторщик или Photoshop вообще не понимают, с какого места начался блок с изображением, а с какого заголовок с EXIF.
                  Также я заметил, что портятся данные в заголовке EXIF, при копировании они получают местами битовый сдвиг, что тоже странно.
                  Ну и похоже на то, что информация в части с EXIF конфликтует с заголовочной информацией изображения. Там разные таблицы квантования изображения получаются. Из-за этого просмоторщики оказываются не в состоянии отобразить изображение, поскольку ориентируются на информацию в EXIF, если вообще находят её.

                  Так что, или допиливать QExifImageHeader, или искать другую библиотеку.

                    V
                    • July 27, 2016, 1:35 a.m.
                    Спасибо за совет

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      • Last comments
                      • AK
                        April 1, 2025, 11:41 a.m.
                        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                      • Evgenii Legotckoi
                        March 9, 2025, 9:02 p.m.
                        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                      • VP
                        March 9, 2025, 4:14 p.m.
                        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                      • ИМ
                        Nov. 22, 2024, 9:51 p.m.
                        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      • Evgenii Legotckoi
                        Oct. 31, 2024, 11:37 p.m.
                        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup