crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> [qt 4.5.1 win32] Метаданные изображений
Elfinit
  опции профиля:
сообщение 15.5.2009, 0:04
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Суть вопроса: иметь в программе возможность просматривать/изменять/добавлять метеданные изображений. Вроде как есть библиотека Exiv2, и даже вроде как есть программка Cchobi, написанная на Qt и юзающая её, но подружить проект на Qt с Exiv2 как-то не удалось. ПОэтому вопрос: либо как подружить, либо есть ли другие решения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.5.2009, 1:25
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


первое, что приходит в голову: посмотреть исходники проекта gwenview он нписан для KDE.
Незнаю до какой степени он завязан на кедах, но может всё таки есть там исходники подходящие.

Вот я смотрю в хранилище и вижу, что в каталог lib\semanticinfo переехало то, что было в каталоге lib\metadata
И каких либо страшных зависимостей от кед, вроде невидно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 15.5.2009, 15:35
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


А с Exiv2 как подружить, нет соображений?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.5.2009, 16:51
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Elfinit @ 15.5.2009, 19:35) *
А с Exiv2 как подружить, нет соображений?
а я даже не в курсе, что это такое, графикой не занимаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 15.5.2009, 18:12
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Ну вот собственно на crossplatform.ru в исходниках нашёл программку Cchobi, в которой этот самый Exiv2 юзается для работы с метаданными.
А Exif, как я понял по беглой пробежке по метаданным - это собсно формат для описания их самых.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.5.2009, 21:53
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3293
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Elfinit @ 15.5.2009, 1:04) *
но подружить проект на Qt с Exiv2 как-то не удалось.
Ты лучше скажи, что делал по шагам, чтобы подружить и почему не удалось (какие ошибки и прочее).
Думаю так будет проще решить твою проблему. Так как не много народу занимается работой с метаданными и не все смогут сказать как и что там, но поправить в случае неправильных действий при сборке или сдруживани многие смогут. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 16.5.2009, 1:26
Сообщение #7


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Накопал решение 8)
Не знаю, правда, какая система сборки у Elfinit, я предлагаю под Windows & MinGW

  1. Загружаем MSYS-1.0.10.exe, libexpat 2.0.1, exiv2-0.18.1, zlib-1.2.3
  2. Устанавливаем MSYS в С:\MSYS
    При установки, дважды соглашаемся с предлагаемыми действиями и прописываем путь к MinGW.
    В Моем случае это D:/Program/MinGW
  3. создаем в C:/MSYS структуру каталогов /z/dev
  4. в dev создаем каталоги zlib, expat, exiv2
    В созданные директории помещаем содержимое соответствующих библиотек.
  5. Запускаем MSYS и выполняем в нем следующие действия
Компиляция библиотек
Build zlib:
    $ cd /z/dev
    $ cd zlib
    $ ./configure
    $ make
    $ mkdir include lib
    $ cp z{lib,conf}.h include
    $ cp libz.a lib
    $ cd ..

Build libexpat:
    $ cd expat
    $ ./configure
    $ make
    $ mkdir include
    $ cp lib/expat{,_external}.h include
    $ cp .libs/libexpat.a lib/libexpat.a
    $ cd ..

Build exiv2:
    $ cd exiv2
    $ ./configure --with-zlib=/z/dev/zlib --with-expat=/z/dev/expat --disable-shared
    (This takes ~4 minutes)
    $ make
    (This takes ~25 minutes)
    $ mkdir include lib
    $ cp src/{exiv2,utils,types,version}.hpp include
    $ cp src/exv_conf.h include
    $ cp src/.libs/libexiv2.a lib
    $ cd ..


Теперь пишем небольшое тестовое приложение. (взято с оф. сайта).
exif.pro
QT          -= gui
TARGET       = exif
CONFIG      += console
CONFIG      -= app_bundle
LIBS        += -LC:/MSYS/z/dev/exiv2/lib/ -lexiv2 \
               -LC:/MSYS/z/dev/expat/lib/ -lexpat
INCLUDEPATH += C:/MSYS/z/dev/exiv2/src
TEMPLATE     = app
SOURCES     += main.cpp
main.cpp
#include <image.hpp> //needed for exif operations
#include <exif.hpp>
#include <iostream>
#include <iomanip>
#include <cassert>

int main(int argc, char *argv[])
{
    try {
        if (argc != 2) {
            std::cout << "Usage: " << argv[0] << " file\n";
            return 1;
        }

        Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(argv[1]);
        assert(image.get() != 0);
        image->readMetadata();

        Exiv2::ExifData &exifData = image->exifData();
        if (exifData.empty()) {
            std::string error(argv[1]);
            error += ": No Exif data found in the file";
            throw Exiv2::Error(1, error);
        }
        Exiv2::ExifData::const_iterator end = exifData.end();
        for (Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
            const char* tn = i->typeName();
            std::cout << std::setw(44) << std::setfill(' ') << std::left
                      << i->key() << " "
                      << "0x" << std::setw(4) << std::setfill('0') << std::right
                      << std::hex << i->tag() << " "
                      << std::setw(9) << std::setfill(' ') << std::left
                      << (tn ? tn : "Unknown") << " "
                      << std::dec << std::setw(3)
                      << std::setfill(' ') << std::right
                      << i->count() << "  "
                      << std::dec << i->value()
                      << "\n";
        }

        return 0;
    }
    catch (Exiv2::AnyError& e) {
        std::cout << "Caught Exiv2 exception '" << e << "'\n";
        return -1;
    }
}


Вуаля. Все собирается и прекрасно работает.

Оригинал статьи где содрал решение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 16.6.2009, 10:39
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Мерси, всё успешно собралось,сейчас тестовую программу погоняю.
Задача на некоторое время была отложена,а сейчас снова стала актуальной. Пытался решить таким образом: нашёл готовые .dll, .lib и заголовки нужных библиотек, прилинковал к проекту, всё собиралось и запускалось, но на месте вызова функций exiv вылетало системное исключение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 16.6.2009, 11:45
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Ошибка при сборке тестового примера:

C:/msys/z/dev/exiv2/lib//libexiv2.a(XMPUtils.o)(.text+0x1a64):XMPUtils.cpp: undefined reference to `__strtod'

И ещё, для чего флаг --disable-shared, мне б желательно всё-таки exiv2 в виде dll собрать..

Собрал без XMP (я так подумал, он впринципе пока не нужен), вроде работает...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 16.6.2009, 11:47
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Elfinit @ 16.6.2009, 12:15) *
C:/msys/z/dev/exiv2/lib//libexiv2.a(XMPUtils.o)(.text+0x1a64):XMPUtils.cpp: undefined reference to `__strtod'
Скорее всего не подцепил expat. В любом случае пример который я привел выше, полностью рабочий. Нужно только поменять пути к библиотекам, но это думаю и так понятно.

Цитата(Elfinit @ 16.6.2009, 12:15) *
И ещё, для чего флаг --disable-shared, мне б желательно всё-таки exiv2 в виде dll собрать..
Сейчас уже не помню. Была какая то проблема со сборкой dll. Нужно править configure. В инете находил, что именно нужно сделать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.9.2020, 7:44