В MaxSite CMS загружать изображения можно как при помощи встроенного загрузчика MaxSite CMS, так и плагина-файлового менеджера. EXIF данные исходного файла загружаются в файл, создаваемый на сервере.
Если изображения загружать без изменений, то EXIF данные можно извлекать из файла изображения на сервере.
Если же происходит изменение изображения (ресайз, наложение водной метки) - EXIF теряются.
Как предотвратить потерю EXIF при изменении изображения?
Почему, при наложении водной метки и ресайзе, теряются EXIF данные об изображении?
Все очень просто.
Для изменения размера или наложения воной метки используется библиотека GD2. При изменении исходного изображения, вместо исходного изображения - создается новое. В это новое изображение и записывается измененная картинка.
EXIF же данные никак не переносятся.
Зачем нужны EXIF данные?
Раньше EXIF данные никак не использовал и о проблемах с этим делом не ведал.
Использовать начал дату снимка в плагине галерей изображений Taggallery. В этом плагине о добавляемом изображении создается запись, содержащая целых три поля даты: дата добавления в БД, дата изменения файла, дата снимка.
В настройках плагина можно указать сортировку картинок (как в админке, так и при выводе галерей в альбомах) по любому из полей, в том числе и по любой дате. Кроме того, можно указать: какая дата выводится, как дата картинки.
Очевидно, что красивее всего выглядит именно дата снимка. А дата снимка находится именно в EXIF.
Но и тут проблем не возникало. Дело в том, что удобнее загружать уже уменьшенные до нужного размера изображения. Ресайз удобно делать такими программами, как: Office Picture Manager или XnView, в которых EXIF не теряется.
Проблема возникла, когда я решил проставить водные метки изображениям, для чего приделал к плагину галерей Taggalery утилиту для наложения водных меток. Эта утилита позволяет просмотреть все возможные варианты наложения, выбрать оптимальный вариант и откатить, если что.
И тут оказалось, что при наложении водной метки EXIF теряются.
Конечно можно сперва добавить картинку в БД, считав дату из EXIF - затем уже наложить watermark. Но это как-то некрасиво.
Сохраняем EXIF при ресайзе и наложении водной метки на изображение.
Порыв интернет я нашел несколько библиотек для работы с EXIF, но без сучка без задоринки заработала только одна: PEL (PHP Exif Library).
Архив с примерами и классом: http://sourceforge.net/projects/pel/.
Вот как прикрутил к утилите Watermark:
// $full_path - полный путь к исходной картинке if ($wotermark_type) // $wotermark_typ - тип наложения для библиотеки GD2 { //каталог плагина галереи изображений $plugin_dir = getinfo('plugins_dir') . 'taggallery/'; // подключаем exif-библиотеку pel require($plugin_dir . 'functions/exif/pel-0.9.1/PelJpeg.php'); // получаем exif исхоного изображения $image1 = new PelJpeg(); $image1->loadFile($full_path); $exif = $image1->getExif(); //Перед изменением создадим копию картинки для отката if (file_exists($tmp_file_path)) unlink($tmp_file_path); copy($full_path, $tmp_file_path); $res_path = add_water_create_water($full_path , $wotermark_type , $userfile_water_file , $tmp_file_path); // сохраняем exif в новое изображение $image2 = new PelJpeg(); $image2->loadFile($res_path); $image2->setExif($exif); file_put_contents($res_path, $image2->getBytes()); if ($res_path == $full_path) echo '<div class="update">Вотермарк наложена. Если не устраивает - произведите откат.</div>'; else echo '<div class="error">Ошибка создания Watermark.</div>'; }
Скачать обновленный плагин: taggallery23.zip