Опубликовано 30 апреля 2010, 22:55 под Agnostic Front - Bomber Zee

В очередной раз ухудшил сайт. На сей раз под руку попалась галерея — решил вытащить из EXIF марки фотоаппаратов и даты снимков. Процесс растянулся на неделю.

Получить производителя и модель — задача, казалось бы, тривиальная. В самом деле:

$exif_data = exif_read_data($image);
$camera = $exif_data['Make'] . ' ' . $exif_data['Model'];

Только вот результаты радуют не особо:

"Canon Canon PowerShot A80"
"CoreLogic SAMSUNG"
"HP              iPAQ rx3000    "
"NIKON COOLPIX L1"
"Nokia N70-1"
"OLYMPUS CORPORATION "
"OLYMPUS CORPORATION C160,D395"
"OLYMPUS IMAGING CORP. C170,D425"
"PENTAX Corporation      PENTAX Optio 33L   "
"PENTAX Corporation PENTAX Optio 30"
"Panasonic DMC-LZ6"
"SAMSUNG TECHWIN CO., LTD Digimax 370 / Kenox D370"
"SAMSUNG TECHWIN CO., LTD. Digimax A40 / KENOX Q1"
"SPREADTRUM 6800"
"Sony Ericsson K550i"

Кто во что горазд. То производителя и туда и туда напишут, то ©®™ навешают (да ещё и большими буквами), щедро разбавив пробелами. Не выдержав несовершенства мира, закрыл я очи и написал вот такую лапшу. Всё это наверняка придётся ещё не раз править, но пока с вышеперечисленным скромным списком справляется.

Теперь далее. Дата:

$taken = array(
    strtotime(@$exif_data['DateTime']),
    strtotime(@$exif_data['DateTimeOriginal']),
    strtotime(@$exif_data['DateTimeDigitized']),
);
array_filter($taken);
$taken = min($taken);

Получение корректных данных осложняется тем, что всякие пидоры не выставляют время на фотоаппарате. Правда, как оказалось, пидор-то всего один — Samsung Digimax A40. Нужно ли говорить чей это аппарат? Ну ещё Pentax Optio 33L (Димка Коромшук), но у того дата сбрасывается как только открываешь отсек для батареек. Но самсунг специально неделю провалялся на столе с открытой крышкой — и не отстал ни на минуту! Позор мне, как только за пять лет ни разу не подумал?

Пришлось, основываясь на дате копирования на комп, названиях файлов и воспоминаниях, писать корректировщик времени. Слава Богу, что фотографии в галерее идут в более-менее хронологическом порядке, и подгонять можно одновременно под несколько — быстрее и точнее:

$_ = "(SELECT id FROM the_tags WHERE title LIKE '%Digimax A40%' AND `key` = 'gallery-hardware')";
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 122807071 WHERE hardware = {$_} AND imageid > 492 AND imageid <= 499");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 122765671 WHERE hardware = {$_} AND imageid > 476 AND imageid <= 492");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 120762000 WHERE hardware = {$_} AND imageid > 414 AND imageid <= 476");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 486600    WHERE hardware = {$_} AND imageid > 384 AND imageid <= 414");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740    WHERE hardware = {$_} AND imageid > 289 AND imageid <= 355");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 72000     WHERE hardware = {$_} AND imageid > 225 AND imageid <= 289");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 342800    WHERE hardware = {$_} AND imageid > 219 AND imageid <= 225");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740    WHERE hardware = {$_} AND imageid > 176 AND imageid <= 219");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 118800    WHERE hardware = {$_} AND imageid > 160 AND imageid <= 176");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 72000     WHERE hardware = {$_} AND imageid = 84");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740    WHERE hardware = {$_} AND imageid <= 49");
DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 141552000 WHERE imageid <= 23");

Располагается это, конечно же, прямо в коде контроллера, перечитывающего EXIF со всей галереи (решил его так и оставить — вдруг ещё какие подробности всплывут). А потом меня просят «поделиться своим движком» (ведь я так мастерски модифицировал WordPress!) и приходится обьяснять: вот понимаешь, да, там всё круто, но есть одна фича: если ID фотки лежит в полуинтервале (492; 499] и она снята на Samsung Digimax A40, то у неё дата будет на 3 года 11 месяцев и 22 дня больше, чем нужно, и это не баг.

Ещё неплохо получилось с легендарной Motorola C650. EXIF она хоть и не пишет, но время создания в свойствах файла сохраняет, а MMCenter, которым я их скачивал на комп, его передаёт. Правда, эти ценнейшие данные дают больше вопросов, чем ответов. Вот, к примеру, одна из самых значимых фотографий — про кока-колу, сделанная вместе с Димкой на остановке после курсов. В 18:12, хотя пара обычно кончалась в 18:25. В пятницу — после математики, хотя всю жизнь казалось, что в среду после русского. Да и по дате это пораньше должно было быть — во времена этой фотки я целыми вечерами ошивался на промофоруме, дорвавшись наконец-то до неповременного интернета. А в середине февраля уже близился бан к компу за неподобающую успеваемость (4 по географии, ну совсем охуел ребёнок!). Сплошные загадки

А вот телефоны от SAMSUNG не блещут. Что в теперь уже папином слайдере, что в опять же Димкином коммуникаторе производитель один — CoreLogic Samsung, а самое дурацкое — не прописана дата. Они стоят в 3 раза дороже моторолы каждый, могут заходить не только в WAP, но и в Internet, а дату вписать в EXIF ну никак. Да, в некоторых файлах тегов нет вообще. Что у меня, что у Димки. Даже Fly со своим Spreadtrum 6800 и то выглядит лучше.

Выставляйте дату на фотоаппаратах

Комментарии (7)
vas3k
1 мая 2010, 00:14
S Q #1
Давно хочу сделать вывод EXIF у себя в галерее. Опередил

Добавлено через 30 минут
А похуй, все равно сделал.
Давно хочу сделать вывод EXIF у себя в галерее. Опередил :P Добавлено через 30 минут А похуй, все равно сделал.
themylogin
1 мая 2010, 00:42
S Q #2
Камера: OLYMPUS IMAGING CORP. FE45,X40
<quote>Камера: OLYMPUS IMAGING CORP. FE45,X40</quote>
vas3k
1 мая 2010, 01:08
S Q #3
Ага, это моя хуита, которая батарейки жрет как сволочь =\

Добавлено через 15 минут
По фоткам у меня в галерее понял, что старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописались. Но, конечно, D80 без комментариев

Добавлено через 2 минуты
Зато новые нокии я смотрю научились хорошо прописываться. Что N73, что N900.
Ага, это моя хуита, которая батарейки жрет как сволочь =\ Добавлено через 15 минут По фоткам у меня в галерее понял, что старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописались. Но, конечно, D80 без комментариев :D Добавлено через 2 минуты Зато новые нокии я смотрю научились хорошо прописываться. Что N73, что N900.
themylogin
1 мая 2010, 13:53
S Q #4
Ага, это моя хуита, которая батарейки жрет как сволочь =\
IMAGING CORP.
старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописались
Ага, из старых никто не знал, я CX65 вручную прописывал, а вот что было у всяких Никит в 10 классе, хз
<quote>Ага, это моя хуита, которая батарейки жрет как сволочь =\</quote>:-\<quote>IMAGING CORP.</quote>*STOP*<quote>старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописались</quote>Ага, из старых никто не знал, я CX65 вручную прописывал, а вот что было у <a href="http://thelogin.ru/gallery/view/88/">всяких Никит</a> в 10 классе, хз :(
osdohtem
4 мая 2010, 12:11
S Q #5
если ID фотки лежит в полуинтервале (492; 499] и она снята на Samsung Digimax A40, то у неё дата будет на 3 года 11 месяцев и 22 дня больше, чем нужно, и это не баг.
Серьёзная фича однако
<quote>если ID фотки лежит в полуинтервале (492; 499] и она снята на Samsung Digimax A40, то у неё дата будет на 3 года 11 месяцев и 22 дня больше, чем нужно, и это не баг.</quote> Серьёзная фича однако :')
anonymous
6 мая 2010, 13:32
S Q #6
// Какой позор, в PHP до сих пор нельзя нормально проверить непустоту массива

а как-же
if (empty($arr)) {
// ...
}
// Какой позор, в PHP до сих пор нельзя нормально проверить непустоту массива а как-же if (empty($arr)) { // ... }
themylogin
6 мая 2010, 15:50
S Q #7
Это не функция, это конструкция. Попробуй
empty(array_intersect(str_split($words[$i]), str_split("0123456789")))
empty can not be used in write context
Это не функция, это конструкция. Попробуй<source>empty(array_intersect(str_split($words[$i]), str_split("0123456789")))</source>empty can not be used in write context :(
Добавить комментарий
Войдите через  Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
Теги
1nsk Alternative E-Business Embedded GNU/GPL-софт HTML/CSS ICQ KDE last.fm Linux Linuxnsk Live Lyceum game Microsoft Motivator MySQL New Age P2P Party Photoshop PHP Python Qt4/C++ SEO Sibnet thelogin.ru Timelapse Web 2.0 Webdev Webstream Windows Wireless А я говорил! Авто Админ Алексеев Аниме Атмосфера Безобразие Бесплатный Wi-Fi Блоги Большой бизнес Боты Бред Бухать Бытовуха Велосипед Весна Вечер Взлом Винил Винтаж Вконтакте Вода Воспоминания Гетто Гламур Гопота Горский Графити Грузовик Дача Двор Девушки Девченки!!! Деньги Дизайн Дом Домофоны Драка Драки Еда Железо Животные Заведения общественного отдыха Задроты Затулинка Зима Игрушки Игры Идея Интересно Интернет Исследование История Казань Карикатура Квартира Класс Компьютеры Коромшук Коты КПК Кран Красиво Криминал Крыша Курение Лето Литература Лицей Лицей НГТУ Лохи Магнитофоны Маркса Мат Математика Машинный перевод Мегафон Менты Метро Мечты Мифы Мне стыдно Мобайл Можга МТС Музыка Мультикасса Мультики Мы помним Надписи Наука НГТУ Недвижимость Непоняятно Новосибирск Носители Ноутбуки Ночь Обидно Обман Образование Общественный транспорт Омск Опечатки Орфография Осень Парк Периферия Пиратство Плохо Погода Поезд Помойка Праздники Презрение Природа Провайдеры Программирование Протест Радиотехника Растения Реклама Религия и вера Ретро Рисунок Руины Рэп Салют Сервер Серверы Сервис Сериалы Скринкаст Скриншоты Смешно СМИ Снег Собаки Совет Софт Спам Спасём Россию Спецтранспорт Стоп-ляп Стройка Студяга Танцы ТВ Типа страх Трамваи Транс Транспорт Уважаю Ужас Умный дом Утро Филдрепорты Философия Форум ФПМИ Хикки Хостинг Цитатник Школа Школа 208 ЭГ Эксперимент Юго-Западный
Twitter 30-04-2010
Lorem Ipsum
Наркотики - это навсегда!
Lorem Ipsum
Firefly by Uriah Heep от New Releases for themylogin Released on Tuesday 20 April 2010. :-\.
Lorem Ipsum
Ещё лучше.
Lorem Ipsum
Температура в тот же день, что и год назад, ешкув.
Lorem Ipsum
Пивасик и квасик, магазин разливного пива.
Lorem Ipsum
Creedence Clearwater Revival [Digitally Remastered] - СЛУШАТЬ НЕВОЗМОЖНО, как я и думал.
Lorem Ipsum
Первый раз за неделю подумал: а если ни у кого нет домашек по диффурам, может самому решить? :-\ Честно, даже не рассматривал такой вариант.
Lorem Ipsum
Это лучший день в году, я уже заранее знаю.
Lorem Ipsum
связали учительницу волейбольной сеткой и играли ее телом в футбол.
Lorem Ipsum
Чо-то блять белая полоса уже 2 года :-\.