По "многочислиенным" заявкам телезрителей кидаю сюда классы для "удобной" работы с IPTC заголовками JPEG-ов
Всего 4 класса:
IPTCField - поле с информацией в загаловке картинки
IPTCInfo - все поля одной картинки
IPTCReader - для чтения полей из файла
IPTCCodes - расшифровка кодов некоторых полей (можно это было хранить в базе, но решил сделать так, чтобы не зависить от наличия базы данных)
И ещё два класса, на которых другие построены:
Object - для IPTCField, IPTCInfo
ObjectList - for IPTCReader.
Эти оба класса вспомогательны, в моём проекте на работе они служат основой для почти всех других классов
Чтобы Обойтись без них, надо в IPTCField, IPTCInfo свои get и set методы написать, а в IPTCReader дописать член класса массив, который отдельные поля хранит и функцию add_object, которая добавляет новые поля в данный массив, и функции, чтобы эти поля потом поочереди отдавать.
IPTCField:
Состоит из типа поля(его номер) и информации, которая храниться в данном поле. Данный класс нужен только для внутренних целей (для IPTCReader-а)
IPTCCodes:
Расшифровка некоторых кодов, которые встречаются в полях. Коды стран, предполагаю, везде одинаковы, поэтому врядли будут меняться. А вот коды категорий и подкатегорий зависят часто от источника и должны всё время обновляться/дополняться. Например, у меня коды от Associated Press, картинки которых нам приходят.
Все три члена класса устроены как статичные массивы для прямого доступа без создания объекта данного класса.
IPTCReader:
Считывает данные из файла (loadFile) или уже из готового куска хедеров файла(loadData) и сохраняет эти данные во внутреннем массиве, который поэлементно передаётся объекту класса IPTCInfo.
IPTCInfo:
Центральный класс. Он хранит всю извлечённую информацию. В переменных класса сохраняються значения отдельных полей. Главная особенность: мне не нужны были все поля, так как из слишком много и почти никогда они все бывают заполнены. Для этого я придумал статичный массив $varsToFields, в котором содержиться какая переменная класса относиться к какому полю. Все поля, которые не имеют переменной, оседают в массиве $fieldsWithNoVars. То есть, если нам интересно какоето новое поле, нужно просто придумать переменную для этого поля, записать её в список переменных класса и добавить имя данной переменной в массив $varsToFields напротив соответствующего поля.
Класс имеет только одну важную функцию,а именно addField, которая как раз обрабатывает поле, полученное из IPTCReader-а. 4 приватных функции set_* нужны, чтобы исправлять некоторые ошибки, которые допускаються в Associated Press, а также чтобы хранить расшифровки кодов (хранящиеся в IPTCCodes) - для этого в классе есть спец переменные, например $categoryName или $countryName, которые не храняться в полях с информацией, но которые я сам беру из IPTCCodes.
Пример:
PHP код:
$reader=new IPTCReader();
$read=$reader->loadFile($pathToJpeg);
if(!$read)
{
die("No file found or No headers in file");
}
$info=new IPTCInfo();
while($field=$reader->next_object())
{
$info->addField($field);
}
echo "Date: ".$info->get("creationDate")."\n";
echo "Country: ".$info->get("countryName");
P.S.: Так как всё делалось в спешке, вся системе не идеальна с точки зрения дизайна.