Суть вопроса: иметь в программе возможность просматривать/изменять/добавлять метеданные изображений. Вроде как есть библиотека Exiv2, и даже вроде как есть программка Cchobi, написанная на Qt и юзающая её, но подружить проект на Qt с Exiv2 как-то не удалось. ПОэтому вопрос: либо как подружить, либо есть ли другие решения?
Litkevich Yuriy
15.5.2009, 1:25
первое, что приходит в голову: посмотреть исходники проекта
gwenview он нписан для KDE.
Незнаю до какой степени он завязан на кедах, но может всё таки есть там исходники подходящие.
Вот я смотрю в хранилище и вижу, что в каталог
lib\semanticinfo переехало то, что было в каталоге
lib\metadataИ каких либо страшных зависимостей от кед, вроде невидно.
А с Exiv2 как подружить, нет соображений?
Litkevich Yuriy
15.5.2009, 16:51
Цитата(Elfinit @ 15.5.2009, 19:35)
А с Exiv2 как подружить, нет соображений?
а я даже не в курсе, что это такое, графикой не занимаюсь.
Ну вот собственно на crossplatform.ru в исходниках нашёл программку Cchobi, в которой этот самый Exiv2 юзается для работы с метаданными.
А Exif, как я понял по беглой пробежке по метаданным - это собсно формат для описания их самых.
Цитата(Elfinit @ 15.5.2009, 1:04)
но подружить проект на Qt с Exiv2 как-то не удалось.
Ты лучше скажи, что делал по шагам, чтобы подружить и почему не удалось (какие ошибки и прочее).
Думаю так будет проще решить твою проблему. Так как не много народу занимается работой с метаданными и не все смогут сказать как и что там, но поправить в случае неправильных действий при сборке или сдруживани многие смогут.
igor_bogomolov
16.5.2009, 1:26
Накопал решение
Не знаю, правда, какая система сборки у
Elfinit, я предлагаю под
Windows & MinGW- Загружаем MSYS-1.0.10.exe, libexpat 2.0.1, exiv2-0.18.1, zlib-1.2.3
- Устанавливаем MSYS в С:\MSYS
При установки, дважды соглашаемся с предлагаемыми действиями и прописываем путь к MinGW.
В Моем случае это D:/Program/MinGW - создаем в C:/MSYS структуру каталогов /z/dev
- в dev создаем каталоги zlib, expat, exiv2
В созданные директории помещаем содержимое соответствующих библиотек. - Запускаем 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 ..
Теперь пишем небольшое тестовое приложение. (
взято с оф. сайта).
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
#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;
}
}
Вуаля. Все собирается и прекрасно работает.
Оригинал статьи где содрал решение.
Мерси, всё успешно собралось,сейчас тестовую программу погоняю.
Задача на некоторое время была отложена,а сейчас снова стала актуальной. Пытался решить таким образом: нашёл готовые .dll, .lib и заголовки нужных библиотек, прилинковал к проекту, всё собиралось и запускалось, но на месте вызова функций exiv вылетало системное исключение.
Ошибка при сборке тестового примера:
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
Цитата(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. В инете находил, что именно нужно сделать.
С путями-то понятно, и expat (в .pro) я цепляю. Но всё равно. Продолжу ковыряться)
Такая вот ошибка при сборке примера:
make: *** No rule to make target `../../../../Qt/4.5.0/mkspecs/default/qmake.conf', needed by `Makefile'. Stop.
В чем может быть проблема?
Elfinit
29.10.2009, 21:49
Exiv2 тут не причём, проблема с конфигурацией Qt
другие Qt-проекты собираются нормально
Запусти qmake чтобы пересоздать Makefile. В нем почему-то прописаны старые пути к директории Qt (может ее перенесли в другое место или обновили)
скинул все в Qt\4.5.0\bin\
перекинул скачанные библиотеки в Qt\4.5.0\include
собралось без ошибок.
только вот что должна программа делать? окно на секунду вылетает и все. и откуда картинку подгружать?
все разобрался, извиняюсь
Цитата(igor_bogomolov @ 16.5.2009, 1:26)
Накопал решение
Не знаю, правда, какая система сборки у
Elfinit, я предлагаю под
Windows & MinGW- Загружаем MSYS-1.0.10.exe, libexpat 2.0.1, exiv2-0.18.1, zlib-1.2.3
- Устанавливаем MSYS в С:\MSYS
При установки, дважды соглашаемся с предлагаемыми действиями и прописываем путь к MinGW.
В Моем случае это D:/Program/MinGW - создаем в C:/MSYS структуру каталогов /z/dev
- в dev создаем каталоги zlib, expat, exiv2
В созданные директории помещаем содержимое соответствующих библиотек. - Запускаем 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 ..
Теперь пишем небольшое тестовое приложение. (
взято с оф. сайта).
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
#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;
}
}
Вуаля. Все собирается и прекрасно работает.
Оригинал статьи где содрал решение.Когда делаю ./configure при Build zlib: пишет Checking for gcc...
Please use win32/Makefile.gcc instead:
После make пишет:
cc -O -DNO_FSEEKO -DNO_snprintf -DHAS_sprintf_void -c -o example.o example.c
/bin/sh: cc: command not found
make: *** [example.o] Error 127
Подскажите в чем проблема
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.