http://habrahabr.ru/company/toptechphoto/blog/221907/
Привет, Хабр.
Хочется поделиться радостью — мы закончили разбор проприетарных RAW форматов с камер Canon и Nikon для нашего сервиса
Pics.io. Для тех, кто не в курсе: основная идея Pics.io заключается в том, чтобы дать людям возможность работать с RAW фотографиями прямо в браузере. Без установки каких-либо программ, плагинов и расширений – настоящий zero footprint.
Когда мы начинали работать, было понимание, что в ближайшие годы цифровая фотография переедет в «облако». Мы знали, что тренд мобильности будет усиливаться, а цены на облачные хранилища снижаться. Тогда web’у не хватало только одного кусочка мозаики — адекватной обработки снимков. Было множество онлайн редакторов, в большинстве своём написанных на Flash, которые не могли удовлетворить фотографов в силу ряда ограничений: они работали с 8-bit JPEG, PNG и имели ограничение на размер файла. Мы решили сделать редактор с поддержкой RAW.
На тот момент у нас было несколько прототипов, работающих с DNG, которые доказывали, что всё это можно сделать на JavaScript и WebGL. Но мы, к сожалению, не могли заставить всех людей мира конвертировать свои фотографии в DNG. Даже у Adobe это не получилось. Мы понимали, что была необходима поддержка «родных» форматов, и несколько месяцев назад мы взялись за самые распространенные проприетарные форматы от Canon и Nikon.
Разбор DNG и проприетарных RAW форматов
По сравнению с CR2 или NEF, у DNG достаточно много преимуществ. Начиная от открытости формата и возможности встраивать в него XMP и заканчивая более оптимальным форматом хранения данных и метаданных внутри DNG-контейнера. Об отличиях и особенностях форматов мы уже писали у себя
в блоге, был
пост на Хабре и, если поискать, то информации достаточно много. Здесь же обратим внимание на технические моменты, скрытые от рядового пользователя.
Большинство RAW форматов (CR2, NEF и DNG) базируются на формате
TIFF, который является теговым форматом. А так как TIFF предоставляет возможность расширять себя приватными тегами, Canon и Nikon активно этим пользуются, записывая кучу необходимой информации в собственные теги в собственном же формате. Причины, почему производители камер делают так для меня остаются загадкой и, если у кого-то есть предположения на это счет, пожалуйста, выскажитесь в комментариях.
По сути, разбор любого RAW состоит из нескольких шагов: декомпрессия данных из JPG, в результате чего получается «сырое» изображение, захваченное матрицей камеры, и дематризация (также дебайеризация) необходимая для восстановления цветовой информации (так как сенсор камеры фиксирует яркость, а не цвет).
Декомпрессия JPG
Так матрица фотокамеры «видит» изображение
Первое, что нужно сделать разбирая RAW, это вычитать метаданные необходимые для алгоритма декомпрессии. Там хранятся нужные размеры, смещения, способ хранения данных и т.д. С DNG всё просто, в спецификации чётко написано что и где лежит (и лежит аккуратно, а не разбросано по файлу). Декомпрессия данных превращается в удовольствие. Формат CR2 немного сложнее, так как переменные разбросаны по разным группам тегов и алгоритм декомпрессии немного варьируется от камеры к камере. Nikon в своем формате всегда использует один и тот же алгоритм, меняются только деревья Хаффмана, используемые для декомпрессии. Эти деревья, в отличие от Canon, не нужно перестраивать каждый раз, а можно вычитать из метаданных. Метаданные же хранятся глубоко в секции Makernote, которая имеет свой собственный формат. Но самым главным недостатком является то, что внутри CR2 и NEF запакованные данные хранятся одним куском (на самом деле Canon хранит несколько кусков, которые потом нужно склеить в один >_<), а DNG хранит много маленьких кусочков (tiles), так что задачу можно легко распараллелить. У нас в
raw.pics.io декомпрессия DNG выполняется в 3-4 раза быстрее, чем на оригинальном RAW файле.
Некоторые камеры, которые поддерживают DNG, могут писать незапакованные данные, размер файла больше, но можно пропустить шаг декомпрессии.
Дематризация «сырых» данных
Второй большой шаг — дематризация. Метаданные, необходимые на этом шаге, производители записывают в собственные структуры внутри TIFF-тегов, которые меняются с выходом новых моделей. Добавляя новые возможности в камеры, производители добавляют новые теги в свои закрытые форматы, и тем самым усложняют поддержку этих функций в стороннем программном обеспечении. А когда дело доходит до восстановления правильного баланса белого или гамма-коррекции нам приходится учитывать и производителя, и конкретные модели камер.
Мы, конечно, немного экономим кэшируя метаданные, так как уже знаем особенности камер и их «железную» начинку, но для получения параметров, зависящих от условий съёмки приходится поддерживать весь зоопарк форматов.
Вообще, процесс дематризации достаточно ресурсоёмкий. Нужно последовательно выполнить несколько операций над каждым пикселем (или окружающими его пикселями), и на изображениях в 20 мегапикселей это выполняется совсем не быстро. =( Тут мы вовсю используем WebWorker’ы и параллелим, как можем. Но всё равно, нужно и хочется ещё быстрее, поэтому сейчас мы вовсю смотрим на
SIMD,
WebCL и прочие техно-радости, которые помогут ускорить процесс.
Послесловие
Разрабатывая конвертер, мы достаточно много узнали про то, как устроены RAW’ы, и если кому-то интересна эта тема, спрашивайте в коментариях.
Попробовать сконвертировать свои CR2 и NEF файлы уже сейчас можно на страничке нашего
RAW конвертера. Работает не быстро, придётся подождать в среднем 15-20 секунд, но теперь последний камень на пути фотографов в «облако» сдвинут. А вместе с апрельским снижением цен на Google Drive почти в пять раз… Можете себе представить. Так что ждите «Лайтрум в браузере». Мы уже работаем над ним.