Разбор RAW в браузере: как мы это делали

174767edc169908a867a3829af86fe22.jpgПривет, Хабр.Хочется поделиться радостью — мы закончили разбор проприетарных 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 eb8d52d6bdedf47f6fd4c0a258a63ee9.pngТак матрица фотокамеры «видит» изображениеПервое, что нужно сделать разбирая 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 почти в пять раз… Можете себе представить. Так что ждите «Лайтрум в браузере». Мы уже работаем над ним.

898108d502aaa52ae2e403cb2e2bfd2f.jpg

© Habrahabr.ru