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

    Привет, Хабр.

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



    UPD: Выложили новую версию, в которой пофиксили разбор Canon 5D Mark III, Nikon D5000, Nikon D700.
    Спасибо Snowly, scumware, fetis26

    UPD2: Если у кого-то были проблемы с сообщением «Format not supported yet...», сейчас должно работать корректно.

    UPD3: Добавили в редактор градиентый фильтр. Один из лучший наших инструментов на данный момент. Посмотреть можно здесь.
    TopTechPhoto
    29.36
    Company
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 109

      +2
      Идея интересная, но реализация пока хромает. CR2 из 5D III открылась не правильно. По сравнению с лайтрум обработка занимает на порядок больше времени.
        +7
        А что неправильно? Давайте вместе пофиксим! =)
          0
          Описать словами сложно)

          image
            +3
            А оригинал CR2 можете выложить куда-то?

            Upd: Воспроизвел — зафиксим! Спасибо!
              +4
              В среду ждите — уже пофиксили!
        +3
        А для Pentax будет поддержка?
          +1
          Вы уже не первый кто спрашивает про Pentax. Поддержка обязательно будет, но, если честно, то пока приоритетнее ускорить процесс разбора!
          • UFO just landed and posted this here
              0
              Pentax не совсем отказался — в камере есть настройка в каком формате снимать PEF или DNG. Но есть же ещё и старые камеры, которые тоже нужно поддерживать.
                0
                Но т.к. есть DNG вопрос снят )) Давно на него перешел и всем советую
                  +1
                  Сам всем советую постоянно и каждй день по два раза.
                    +1
                    Только вот PEF весит в два раза меньше DNG. И толку от этой универсализации — Пентакс переходит на адобовский формат, а остальные продолжают юзать свои. Плюс поддержка старых камер. Или что, от неё откажутся со временем? А потом когда-нибудь откажутся и от DNG? Ну уж нет — формат либо должен гарантировать обратную совместимость, либо пусть этим озадачатся производители конвертеров.
                      0
                      У меня китайфон Xiaomi 3 умеет снимать в DNG. А с помощью адобовского конвертера можно пачками перегонять чужие равки в универсальный формат — пару лет назад сделал это с 200-гигабайтным архивом снимков от Fuji.

                      IMHO, DNG предпочтительнее.
                  • UFO just landed and posted this here
                      0
                      А зачем тогда использовать родной конвертер?
              0
              1. При нажатии на кнопки коррекции экспозиции процесс конвертации происходит заново.

              2. Можно ли было портировать dcraw с помощью emscripten?
                0
                1. Процесс конвертации происходит частично, опускается шаг декомпрессии JPG. Из-за особенностей процесса демозаика, для того чтобы экспозиция наложилась правильно, нужно делать этот шаг заново.

                2. Да можно было (и у нас даже есть такая сборка), но в этом случае мы получаем практически чёрный ящик, а нам нужна более тесная интеграция с алгоритмом конвертации.
                  0
                  А какой алгоритм демозаика вы использовали?
                    0
                    Сейчас используется простая билинейная интерполяция — она дает достаточно оптимальное качество за приемлемое время. Попробовали бикубическую, но очень сильно падает производительность.
                      0
                      Ну насчёт качества не соглашусь. Может для фейсбука и ОК, но не более. Хотя возможно вы и ориентируетесь на непритязательную аудиторию.
                        0
                        Конечно, у всех разные критерии оценки качества.
                        Когда мы сможем интерполировать достаточно быстро, обязательно сделаем и градиентную, и AHD и ещё кучу.
                          0
                          Что у вас за зверь на бекенде этим занимается?
                            +1
                            Всё исполняется на клиенте в браузере.
                +7
                Разрабатывая конвертер, мы достаточно много узнали про то, как устроены RAW’ы, и если кому-то интересна эта тема, спрашивайте в коментариях.


                Лучше бы и расписали сразу в посте — я думаю, что многим было бы интересно.

                В целом — удачи. Очень интересно как будет развиваться этот проект. :)
                  +5
                  Если хабру будет интересно, то напишем. А так пост неинтересный получился?
                    +1
                    Нет нет, что вы. Очень интересный пост, просто теперь хочется заглянуть глубже во внутренние детали этих самых RAW'ов. Продолжайте! :)
                  –2
                  А почему оно работает так медленно?
                  Почему простенький XnView а тем более фотошоп равы открывают мгновенно, а ваше поделие задумывается почти на полминуты?
                    0
                    XnView и Photoshop имеют немного больше технических возможностей для повышения производительности.
                    Мы только начали, но наша цель сократить это время до приемлемого. Мы как раз работаем над этим.

                    Если вам не настоящий разбор RAW, можете попробовать «быстрый» конвертер — http://raw2jpeg.pics.io
                      0
                      А вы разбор на сервере делаете чтоль?
                      Последний .nef так и не дождался. :(
                        0
                        В том и дело, что только на клиенте — только JS. Отчасти, в этом и есть причина недостаточной производительности.
                        Можете помочь и выложить куда-то ваш NEF, возможно есть какая-то ошибка?
                          0
                          я вот этого файла не дождался.

                          www.rawsamples.ch/raws/nikon/d700/RAW_NIKON_D700.NEF
                            +2
                            Ну бывает же такое — вам нужно в лотерею играть с таким везением!
                            Только сегодня отправил фикс для D700 в master. В среду выкатим билд c поддержкой этой камеры.
                            Спасибо, +1
                              0
                              В лотереях мне не везёт примерно так же как с софтом: если что-то может не работать, то оно у меня не работает.
                              Это моя настоящая беда, т.к. в моих руках отказывается работать почти всё.

                              Незачто.
                                +3
                                Переходите в тестеры)
                    +2
                    Попробовал загрузить RAW с Sony Alpha a30 — говорит, что не поддерживается.
                    Планируется поддержка Sony?
                      0
                      Да, Sony и Pentax — первые, кто появится за Canon и Nikon.
                        0
                        Спасибо, будем подождать)
                      0
                      Говорит, что мой NEF с D7000 «Not supported yet».
                        0
                        Выкладывайте куда-то, проверим.
                          0
                          D90 — аналогично
                            0
                            Какие браузер и ОС?
                              0
                              FF / Chrome @ Win7
                                0
                                Пробуйте пожалуйста.
                            0
                            Какие у вас браузер и ОС?
                              0
                              Проверяйте. Должно быть OK.
                              0
                              Эх, не позавидуешь вам, ребята. В этих форматах столько костылей, чуть ли не у каждой камеры свои вариации на тему. Кстати, не пробовали распараллеливать разбор через несколько Web Workers?
                                0
                                Да так и есть! Где можно распараллелить, как раз используем воркеры.
                              • UFO just landed and posted this here
                                  0
                                  Конечно смотрели. =)
                                  dcraw вообще сложновато читать, в отличие от rawtherapee.
                                  А метаданные мы сами себе подготовили с помощью exiftool.
                                    +1
                                    Еще существует LibRAW.
                                  0
                                  Nikon D90 не поддерживается.
                                  Фото
                                    0
                                    Должен поддерживаться. Как вы определили, что не поддерживается?
                                      0
                                        0
                                        Была проблема когда-то, когда Windows 8 портила mimeType у raw файлов. Проверьте, пожалуйста.
                                          0
                                          А по подробнее можно?
                                            0
                                            Мы как-то наблюдали баг, когда дропнутые из Windows файлы в поле type объекта File писали какую-то ерунду.
                                            Но я как-то сомневаюсь, что у вас этот сценарий — было давно.
                                              0
                                              Проверьте пожалуйста
                                                0
                                                Отлично пошло. Около 30 секунд на снимок
                                                  0
                                                  Занимаемся оптимизацией как раз.
                                                  Первые тесты SIMD разочаровали — работает сейчас даже медленнее, чем обычные JS массивы.
                                                  Но есть план, думаем раза в 1,5-2 ускорить за счет оптимизации «в лоб».
                                                    0
                                                    Сейчас должно быть быстрее!
                                                      0
                                                      Теперь 20 секунд на снимок :)
                                          0
                                          Мой NEF с D90 открылся.
                                          dion.org.ua/tmp/20131110_145611_00.NEF
                                          +4
                                          Тут многие ругают, мол долго, так это же на JS! По-моему очень круто. 22-мегапиксельный DNG (21 МБайт) открыло за ~5-6 секунд. Меня такая скорость онлайн-инструмента впечатляет. Молодцы! :) Учитывая что это ещё ранняя версия, очень круто…
                                            –2
                                            Тут многие ругают, мол долго, так это же на JS!


                                            А что, JS и правда такой медленный? Даже сегодня?
                                            Там ведь сейчас какие-то мегаоптимизации применяют, т.е. кричат о них на каждом шагу. Что-то там было про asm.js (не помню как правильно пишется).
                                            Кто-то там даже линух «портировал» на JS…
                                            0
                                            И ни слова про PEF'ы. Обижаете. Алсо, у пентаксов есть DNG, но он как-то криво получается, так что пришлось переключиться в PEF'ы.
                                              0
                                              Почему-то NEF от D40 определяет как от D3100
                                                0
                                                Попробуйте пробежаться по нему с помощью exiftool и посмотрите поля Make и Model— может он и правда от D3100.
                                                  0
                                                  Пробежался…

                                                  $ exiftool _DSC0439.NEF | grep Make
                                                  Make: NIKON CORPORATION
                                                  Maker Note Version: 2.10
                                                  Warning: [minor] Suspicious MakerNotes offset for ExposureBracketValue

                                                  $ exiftool _DSC0439.NEF | grep Model
                                                  Camera Model Name: NIKON D3100

                                                  Забавно, что я только что сделал эту фотку со своего D40, который у меня под рукой лежал…
                                                    0
                                                    В принципе не важно, главное что от 6D нормально конвертируется. Желаю вам удачи в развитии проекта. А D40 уже давно пора отправить на свалку…
                                              0
                                              502 Bad Gateway


                                              Вот и прилёг сайт, хабраэффект «это вам не это» ©
                                                0
                                                RW2?
                                                  0
                                                  Пока нет
                                                    0
                                                    Спасибо, Кэп )

                                                    Я, собственно, интересуюсь планами, да и как сам формат «внутре» выглядит? Вы интересно сравнили несколько форматов, было бы неплохо соньку добавить.
                                                  0
                                                  Canon EOS 400D — Format not supported yet…
                                                  Или я что-то делаю не так.
                                                    0
                                                    Браузер и ОС какие?
                                                      +1
                                                      Win 8.1 x64, Opera 21.0.1432.57
                                                        –1
                                                        Мы пока не поддерживаем Opera. Подскажите свой User-Agent, пожалуйста.
                                                          +1
                                                          Ну это же по сути Хромиум…
                                                          Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36 OPR/21.0.1432.57
                                                    0
                                                    darktable для linux смотрели? Там интересный процесс превращения из рав в картинку.
                                                      0
                                                      darktable поражает нестандартностью подхода к обработке изображений — открыл для себя много новых инструментов и периодически сравниваю с ео результатами. Если бы только не падал так часто(
                                                      0
                                                      Интересно было бы посмотреть на использование asm.js для этих целей.

                                                      Хотя его поддерживает пока похоже только Firefox, у хрома свой несовместимый NaCl.
                                                      0
                                                      не шмогла
                                                      FF28/Win7, равка от Nikon D5000

                                                      Лог ошибок
                                                      init:require [object converter]
                                                      main.js (line 26793)
                                                      22:28:31.962 CSI/tbsd_
                                                      22:28:31.964 CSI/_tbnd
                                                      GET https://fbstatic-a.akamaihd.net/rsrc.php/v2/yh/r/A0aJGLNPVPL.js
                                                      	
                                                      200 OK
                                                      		118ms	
                                                      like.p...s=false (line 3)
                                                      TypeError: getComputedStyle(...) is null
                                                      	
                                                      
                                                      ...\["\\\/b-u]/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE]...
                                                      
                                                      cb=gapi.loaded_0 (line 31)
                                                      Read 10072103 bytes from file
                                                      main.js (line 11302)
                                                      Parse file metadata: 85ms
                                                      main.js (line 21383)
                                                      JPG decompression: 3068ms
                                                      main.js (line 11319)
                                                      Additional metadata decoding: 1ms
                                                      main.js (line 11319)
                                                      Preparing for demosaic: 304ms
                                                      main.js (line 11319)
                                                      _array is undefined
                                                      	
                                                      
                                                      ...\["\\\/b-u]/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE]...
                                                      
                                                      cb=gapi.loaded_0 (line 31)
                                                      _array is undefined
                                                      	
                                                      
                                                      for(var i=0; i < _array.length; i++){
                                                      
                                                      5
                                                      DNGMatrix.js (line 159)
                                                      fb:like failed to resize in 45s
                                                      
                                                        0
                                                        Как это не круто, что надо регистрироваться надо, для того чтобы на интерфейс взглянуть. Хоть бы скриншоты какие-то вывесили. Как построен workflow из описаний на сайте вообще не возможно понять.
                                                          0
                                                          Мы еще не прикрутили красивый интерфейс в Pics.io. Обязательно повесим на главную страницу, как только интерфейс будет соответствовать. Спасибо.
                                                          0
                                                          ORF (Olympus) планируется?
                                                            0
                                                            Да, но не в первую очередь.
                                                            0
                                                            Отличное начало. А почему картинка намного темнее чем при открытии в ACR без каких либо настроек, тушка d90?
                                                              0
                                                              Я проверю. Действительно сильно темнее?
                                                                0
                                                                из дома пробовал было сильно темнее, с работы пишет что формат не поддерживается ( win8.1 x64: ff 31 aurora, chrome 34 stable, opera 21 )
                                                                  0
                                                                  Сейчас формат должен обрабатываться нормально.
                                                                  Воспроизвели на удаленной машине, пофиксили заочно =)))
                                                                    0
                                                                    а NEF когда заработает? очень хочется потестить)

                                                                    upd: внезапно заработало)
                                                                      0
                                                                      Выкатили сегодня свежий релиз, где пофиксили этот баг.
                                                                      0
                                                                      Теперь работает, картинка по-прежнему намного темнее подефолту.
                                                                      yadi.sk/d/1IAYkdmiPVxvp
                                                                      yadi.sk/d/ODVkKbHvPVzic

                                                                      равик если нужен:
                                                                      yadi.sk/d/1BuTQQTiPVyaH
                                                                        0
                                                                        Забрал исходник — проверим.
                                                                –1
                                                                edit.pics.io doesn't support your browser


                                                                opera 19 на движке хрома. Уверен если бы вы не поставили заглушку, то все бы работало.

                                                                так что досвидания.
                                                                  –1
                                                                  К сожалению, мы не тестировали сервис для работы в Opera, поэтому пока можем гарантировать полную работоспособность. В ближайшее время мы, конечно, планируем добавить ещё и поддержку Opera, но пока не успеваем тестировать во всех браузерах.
                                                                    0
                                                                    Новая Опера (>15). сделана на основе хромиума. в 99% случаев на ней работает все что работает в хроме.
                                                                    Почему бы просто не убрать заглушку а пользователи протестируют :)
                                                                  0
                                                                  X3F равки сервис понимает?
                                                                    0
                                                                    Нет, Sigma использует не байеровский фильтр, так что мы пока отложили этот формат.
                                                                    Но, если честно, руки чешутся попробовать. =))
                                                                    0
                                                                    А libraw не смотрели? www.libraw.org/
                                                                    0
                                                                    Chromium Version 31.0.1650.63 Ubuntu 13.04 (31.0.1650.63-0ubuntu0.13.04.1~20131204.1) не поддерживается, а жаль. Когда можно будет потестировать?
                                                                      0
                                                                      Chrome/Chromium начиная с 32 версии.
                                                                        0
                                                                        Спасибо, есть повод обновиться
                                                                      0
                                                                      Не забудьте про облака box.com и яндекса, там людям по 50 и 200Гб раздавали, так что многие сделали их основными
                                                                        0
                                                                        t4i не поддерживаете пока?
                                                                          0
                                                                          Расшарьте ваш raw со мной и в следующий релиз добавим.

                                                                        Only users with full accounts can post comments. Log in, please.