Google Chrome

индекс
224,13

Exponator – расширение для просмотра EXIF-данных фотографий

Exponator Я достаточно давно хотел сделать расширение, которое позволяло бы просматривать данные об экспозиции фотографии, которые хранятся в EXIF. И вот, вдохновленный постом «Создание расширения для Google Chrome» решил-таки потратить на это время.

Ссылка на расширение: Exponator.

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

Сперва я озаботился поиском javascript-библиотеки, которая бы читала EXIF блок из jpeg файлов: изобретать велосипед никакого желания не было. Почти сразу я нашел необходимое на сайте Nihigoloc: http://www.nihilogic.dk/labs/exif/. В библиотеке скрипт проходит по всем изображением, скачивает их в бинарном виде, проверяет наличие EXIF-данных, парсит их и добавляет новое поле к исходному изображению. Практически то, что нужно.

Вторым шагом стало изучение документации и более подробное прочтение статьи про создание расширения. Для расширения не нужна кнопка в строке адреса, да и страница настроек на данном этапе лишняя. Недолго думая я открыл раздел Content scripts и приступил к третьему шагу: написал, казалось бы, рабочий код, который, как ни странно, не заработал.

При этом дебаггер Хрома (я даже не ожидал, что он настолько хорош) ни на что не ругался: XMLHttpRequest отправлялся, а ответа не было. Я убил на это около часа, а потом узнал, что Content-скрипты не могут обращаться к данным вне домена страницы. А фотографии, в большинстве своем, хостятся на серверах, отличных от тех на которых отображаются.

Решением задачи оказалась фоновая страница, которая ограничивается только в манифесте расширения в разделе permissions. Если там указать http://*/, то из фоновой страницы можно будет послать запрос на любой домен. Кусок манифеста:

"background_page": "background.html",

"permissions": [
 "http://*/"
],

"content_scripts": [
 {
  "matches": ["http://*/*"],
  "js": [ "EXIF.js", "js.js"],
  "run_at": "document_start"
 }
 ]


* This source code was highlighted with Source Code Highlighter.


Но решение одной задачи влечет за собой появление следующей: как фоновой странице обмениваться данными с Content script? Документация описывает два способа: разовый запрос и соединение, которое может жить неопределенное время. Мне нужно было отправить в фоновую страницу ссылку на изображение, загрузить ее там, а назад вернуть массив с разобранными EXIF-данными. По логике вещей мне вполне подходит разовый запрос, но я не смог разобраться в том, как он работает. А обычное соединение пошло сразу.

В результате в фоновой странице был добавлен обработчик сообщений, который получает адрес изображения, скачивает картинку, достает из нее необходимые данные и, пользуясь тем же портом, отправляет их обратно:

chrome.extension.onConnect.addListener(function(port) {
    port.onMessage.addListener(function(imgSrc) {
      BinaryAjax(
        imgSrc,
        function(HTTP) {
          var EXIF = EXIF.findEXIFinJPEG(HTTP.binaryResponse);
          port.postMessage(EXIF);
          }
        )
    });
  });


* This source code was highlighted with Source Code Highlighter.


А в скрипте страницы создается порт, отправляется ссылка на изображение, а при получении ответного сообщения массив данных присваивается полю exifdata:

var port = chrome.extension.connect({name: "exif"});
    port.onMessage.addListener(function(oEXIF) {
        oImg.exifdata = oEXIF || {};  
              });
    port.postMessage(oImg.src);


* This source code was highlighted with Source Code Highlighter.


После чего из EXIF берутся диафрагма, выдержка и светочувствительность и добавляются к Title изображения:



Вопрос к залу: возможно ли получить доступ к кэшу Хрома? Кэширует ли Хром XMLHttpRequest? А то сейчас каждое изображение скачивается дважды: один раз при загрузке страницы, второй раз при получении EXIF-данных.

Ссылка на расширение: Exponator.

UPD: Некоторые картинки могут не работать. Почему-то некоторые сервера не дают их загрузить.

UPD: При желании шаблон можно изменить в настройках.

UPD: Символ * в шаблоне выводит все доступные поля EXIF.
+27
22 ноября 2009, 19:32
20

комментарии (18)

+1
Psy_Nejumi303 #
спасибо!
+1
Skif300000 #
Спасибо, действительно очень прикольная и интересная идея.
+1
nihi_l_ist #
Очень полезное расширение, так как сам занимаюсь фотографией и интересно просматривать настройки, при которых был создан кадр, так что спасибо. Я и сам сейчас делаю расширение, связанное с фликром, так что вдвойне спасибо за описание процесса.
+2
HDg #
спасибо большое
выложите расширение на chromeextensions.org/
0
3fonov #
Хорошо. Зарегистрировался, но еще не успел его там выложить.
0
3fonov #
Обновил ссылку.
+1
Jenyay #
Спасибо, полезное расширение.
+2
slipknot69 #
Респект! Спасибо за труд
+4
sofcase #
Хромик все больше и больше набирает обороты в количестве плагинов и это очень радует.
+3
Terror #
По поводу Вашего вопроса — к кэшу, текущими, штатными методами, доступными для расширений, доступ получить нельзя. Для таких целей можно использовать NPAPI plugin, включенный в расширение, который представляет из себя DLL библиотеку, которая, в свою очередь, может все. Реализовать такую библиотеку не сложно, основная сложность — разобраться с тем, как Chrome хранит кэш (можно подглядеть в его исходниках).
0
3fonov #
Спасибо. Даже не смотрел туда. А он .net поддерживает?
Пойду разбираться.
+2
Terror #
В принципе, нет разницы на чем написан плагин, главное, чтобы он представлял из себя Dll-ку, которая экспортирует ряд обязательных функций. Плюс Вы можете взять исходники моего NPAPI плагина, входящего в состав расширения для сворачивания Chrome в трей. Если будут вопросы — спрашивайте, можем пообщаться через ICQ или Jabber (указаны в моем профиле).
0
3fonov #
Спасибо. Посмотрю.
НЛО прилетело и опубликовало эту надпись здесь
–1
stas_agarkov #
блин, мужик! открой оперу и нажми на изображении правой кнопкой, да выбери там пункт свойства изображения и будет тебе счастье, ебаный фонарь.
0
3fonov #
Слишком много движений. :)
0
stas_agarkov #
ну, как знаешь :)
0
Methos #
chrome 4.0.249 — это расширение не работает… по картинке вожу мышой — никакой инфы не выводит.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.