Содержание
- Кому может быть интересен этот проект, и что мы хотим получить
- Цели и задачи
- Принципы сопровождения LibRaw
- Произведенные улучшения dcraw
- Планируемые улучшения
Кому может быть интересен этот проект
Предлагаемый вашему вниманию проект и порождаемый им программный продукт предназначены для:
- разработчиков новых raw-конверторов,
- желающих написать свой графический интерфейс для обработки raw-файлов
- разработчиков и энтузиастов, создающих отдельные собственные основные и вспомогательные алгоритмы обработки
изображений, как то:
- интерполяция (дебайеризация),
- шумопонижение,
- баланс белого,
- коррекция аберраций и дисторсий,
- преобразования цвета (например, обработка профилей камер),
- анализ данных raw,
- сравнение камер и объективов
- и так далее...
Среди существующих сегодня относительно немногочисленных реализаций распаковки RAW-данных, получаемых с цифровых фотокамер, наиболее распространены и наиболее широко используются реализации на основе утилиты dcraw, написанной Dave Coffin. Ее популярность связана с тем, что трудно найти сколько-нибудь распространённую камеру, которая не была бы поддержана данной утилитой, а сам уровень поддержки распаковки весьма хороший.
Однако на пути разработчиков и энтузиастов, использующих или собирающихся использовать dcraw для решения указанных выше задач, стоят несколько препятствий. Первое из них состоит в том, что автор dcraw принципиально не оформляет свой программный продукт в виде библиотеки, удобной для использования, оставляя это на откуп всем желающим (и не возражая против этого). Помимо этого, dcraw содержит ряд особенностей и фотографических некорректностей, которые могут мешать ее использованию без модификаций. В результате практически все разработчики (часть из которых перечислена на сайте dcraw) раз в несколько месяцев, независимо друг от друга, переводят очередную версию утилиты в библиотечный вид.
Для энтузиастов же «входная стоимость» возможности проверки собственных идей и реализации собственных алгоритмов оказывается, зачастую, непомерно высокой: нужно либо пользоваться командной строкой dcraw (что приводит к обязательному использованию неотключаемых ранних стадий обработки), либо разобраться в исходном коде dcraw и поддерживать собственную библиотеку на ее основе.
Таким образом, неудобства, присущие dcraw, значительно сужают сообщество разработчиков и тормозят процесс развития и совершенствования конверторов RAW-формата.
Цели и задачи
При создании LibRaw мы хотим "получить библиотеку на основе dcraw, только лучше":
- "обиблиотечить" dcraw, т.е. разработать стабильный и консистентный API, пригодный для использования в других приложениях (RAW-конверторах, анализаторах данных, склейщиках панорам и так далее).
- Разделить на независимые части (группы вызовов API):
- чтение, раскодирование и распаковку RAW-данных - и это основная функциональность LibRaw;
- преобразования данных: интерполяцию, баланс белого и т.п.;
- вывод результатов обработки в файлы.
(Две последние группы функций поддерживаются, в первую очередь, для целей тестирования совместимости с dcraw)
- Улучшить процедуры извлечения и раскодирования RAW-данных (подробнее - ниже)
- Дать другим разработчикам "рамку" (бесплатную и в открытых исходниках), в которой можно было бы, например, экспериментировать со своими способами обработки RAW-данных (интерполяция, шумопонижение, баланс белого и так далее, возможные варианты приложения своих усилий частично перечислены выше), и создавать свои графические оболочки и интерфейсы, не разрабатывая RAW-конвертор целиком.
- Обеспечить лёгкость внесения изменений для синхронизации кода с релизами самой dcraw.
Принципы сопровождения LibRaw
- Повторить функциональность dcraw, взяв ее исходные тексты за основу, добиться бинарной идентичности (при одинаковых настройках) результатов работы dcraw и утилит на основе LibRaw.
- Избавляться от недостатков dcraw (о некоторых из них см. ниже улучшения dcraw и план работ).
- По мере совершенствования dcraw (поддержка новых камер, исправление ошибок, улучшение алгоритмов) - импортировать улучшения из dcraw в LibRaw.
- Изменения API: запланированные улучшения потребуют расширения API. Такие изменения будут делаться большими change-set-ами, а режимы совместмости со старыми приложениями будут сохраняться, насколько это возможно.
Произведенные улучшения dcraw
На момент написания данного текста в LibRaw внесены следующие дополнительные улучшения относительно исходного кода dcraw:
- Полностью убраны глобальные переменные (а при сборке thread-safe варианта - и статические переменные функций).
- Thread-safety. Пример использования в многопоточном режиме включен в поставку библиотеки.
- Извлекаемые из RAW-файла данные несколько структурированы: геометрия отдельно, цветовые данные отдельно. Эта работа еще не закончена и будет продолжена одновременно с работой над улучшением обработки EXIF.
- Извлечение RAW-данных и thumbnail может быть сделано за 2-3 вызова API с очень простым программным интерфейсом.
- Работа с цветовой информацией: для цветовых данных (коэффициенты баланса белого, тоновая кривая и т.д.) добавлены флаги, показывающие, откуда эта информация: извлечена из RAW-данных, вычислена по самому изображению, взяты константы из кода.
- Извлекается ICC-профиль (для тех RAW-файлов, где он есть)
- Само изображение и thumbnail можно извлечь последовательными вызовами, без переоткрытия файла и перезапуска библиотеки.
- Несколько снижены требования к необходимому количеству оперативной памяти
- Работа с маскированными пикселями и уровнем черного: возможно отключить обязательное вычитание уровня черного и фильтрацию нулевых пикселов
Планируемые улучшения
Код dcraw нуждается в существенных изменениях и дополнениях:
- Выдача распакованных данных в различных memory layouts: в зависимости от потребностей вызывающей
программы, результаты распаковки RAW будут выдаваться в одном из вариантов, выбираемом на runtime:
- 4-компонентные пиксели (внутренний формат данных dcraw)
- байеровский формат: двумерный массив, каждый элемент которого соответствует пикселю матрицы
- 4 двумерных массива (по одному на каждый компонент)
- Однопроходная распаковка RAW-файлов с несколькими вариантами изображения: для тех камер, где это применимо (камеры FUJI, камеры с режимами 4-shot/16-shot) будут извлекаться несколько планов одного изображения.
- Работа с краями диапазона значений: минимальными значениями (часто называемыми точкой черного) и
максимальными значениями (точкой насыщения).
- Вычитание точки черного уже сделано необязательным. В следующие версии LibRaw будет включен код, выполняющий вычисление уровня черного специфическим для конкретной камеры способом.
- Максимальные значения так же могут быть разными по каналам, соответственно и эти значения надлежит рассчитывать на этапе распаковки RAW-данных и выдавать в рамках API. Вычисление максимальных значений для конкретного экземпляра камеры при конкретной чувствительности (калибровка конвертора) - задача приложения, вызывающего LibRaw.
- Работа с черной рамкой: данные, считанные с черной рамки (или двух черных рамок - для тех камерах, где их две) нужно делать доступными в вызывающем приложении (это может оказаться желательным, а порой, для некоторых типов камер - и необходимым для подавления определённых типов артефактов, в частности - banding'а).
- Верификация распаковки данных для максимального набора форматов файлов. Существует мнение, что некоторые форматы данных dcraw распаковывает не вполне корректно.
- Работа с EXIF/Makernote: извлечение данных в большем объеме, в частности:
- Извлечение максимально возможного количества данных о цвете (настройки баланса белого, профиль, тоновая кривая, настройки контраста и т.п.)
- Генерализация данных о цвете: приведение цветовых данных от различных камер к "общему знаменателю" с целью упростить обработку цвета (без потери качества обработки).
- Извлечение данных о камере (версия firmware, серийный номер)
- Извлечение данных о кадре (оптика, дистанция фокусировки, фокусировочные точки и их координаты и т.п.)
- Извлечение полного массива EXIF-данных без анализа структуры с целью облегчения копирования EXIF-данных в выходные файлы.
- Генерализация работы со сложными форматами, в частности:
- RAW-файлы от камер Fuji (с двумя наборами сенсоров)
- RAW-файлы от задников с режимами 4-shot и 16-shot
- Технологические улучшения, в частности:
- Извлечение ICC-профиля (для тех RAW-файлов, где он имеется).
- Уменьшение объемов аллоцируемой памяти в тех случаях, когда постобработка не будет вестись в том же буфере, куда были прочитаны RAW-данные.
В то же время, никаких модификаций и расширений кода обработки данных dcraw (де-байеризация, цветовые преобразования и так далее) мы производить не планируем, это все должно быть задачей вызывающего приложения. Стандартные режимы обработки, включенные в dcraw (за исключением поддержки LCMS и libjpeg и некоторых несущественных этапов обработки) будут сохранены неопределенное время (в наборе вызовов API, эмулирующих dcraw).
Новые комментарии