LibRaw 0.14 Alpha3

Вышла новая "девелоперская" версия LibRaw 0.14-Alpha3, содержащая большое количество концептуальных изменений.

Цель их - дать возможность интерактивного (real-time) изменения параметров конвертации, чтобы пользователь мог видеть результат "кручения ручек" сразу после кручения.

Современные мониторы имеют разрешение 2-4 мегапикселя, а камеры - от 10 мегапикселей и выше. Как следствие, при показе полного кадра на мониторе нет необходимости производить полную демозаику, все равно никто не оценит.

Для 10-мегапиксельного изображения LibRaw 0.14-A3 обеспечивает постпроцессинг за 160-200 мсек. в режиме half-size (на хорошем современном десктопном компьютере). Как следствие, пользователю можно давать возможность видеть результаты изменений параметров (баланса белого, экспокоррекции) практически мгновенно.

К сожалению, обеспечить постпроцессинг с "полным качеством" с такой скоростью нельзя, наше предложение для разработчиков конверторов - показывать "с полным качеством" в отдельном окне приложения небольшой участок изображения (скажем 200X300 пикселов).

За счет оптимизации обработки кроппинга, такой участок может быть обсчитан очень быстро: за 8-9 мсек. для AHD-интерполяции, за 12-15 мсек для AHD+highlight recovery. В результате, обновление этого отдельного окошка можно делать со скоростью 60-100 кадров в секунду вместе с движениями мыши.

Изменения версии 0.14:

Разрешены повторные вызовы постобработки (LibRaw::dcraw_process) без переоткрытия файла парой вызовов open()/unpack(). При этом, постобработку можно повторять меняя любые параметры обработки (за исключением выбора кадра через shot_select).

  • Новый пример samples/multirender_test.cpp показывает как использовать новые возможности.
  • Необработанные RAW-данные сохраняются в отдельном буфере (2 байта на пиксель для Байеровских изображений, 8 байт на пиксель для Foveon, sRAW и других полноцветных RAW). Как следствие, для байеровских изображений LibRaw требует на 25% больше памяти чем ранее.
  • Новый вызов LibRaw::raw2image() преобразует RAW-данные в старый формат imgdata.image Если вы используете LibRaw::dcraw_process или LibRaw::document_mode_processing(), вызывать raw2image() не нужно (и даже вредно), все будет сделано внутри функции постпроцессинга.
  • Новый вызов LibRaw::get_decoder_info() позволяет определить формат хранения RAW-данных (если вам нужен к ним доступ). См. samples/unprocessed_raw.cpp как пример использования.
  • LibRaw::adjust_sizes_info_only() может вызываться произвольное количество раз, втч. и вместе с dcraw_process()
  • Новый вызов LibRaw::free_image() Освобождает память, выделенную для imgdata.image. Может быть использован в случае, если обработанный битмэп более не нужен вызывающему приложению, однако время для уничтожения или recycle() объекта LibRaw еще не наступило, например может повторно быть вызвана функция постобработки dcraw_process()
  • Новые вызовы добавлены в C-API: libraw_raw2image() - аналог LibRaw::raw2image() libraw_free_image() - аналог LibRaw::free_image() libraw_get_decoder_info() - аналог LibRaw::get_decoder_info()
Если ваша программа использует обычный порядок вызовов open()/unpack()/dcraw_process(), то можно в ней ничего не менять и все будет работать как раньше. Однако для интерактивных программ, где параметры обработки меняются пользователем, можно пропустить вызовы open()/unpack() при повторной отрисовке и показать пользователю результат гораздо быстрее.

Если ваш код использует RAW-данные (open()+unpack(), а обработка своя), то вам нужно или переключиться на новый формат данных, или использовать вызов LibRaw::raw2image() для конверсии из нового формата в старый.

Если ваш код использовал доступ к маскированной ("черной") рамке, то вам нужно использовать новый RAW-буфер. См. samples/unprocessed_raw.cpp в качестве примера.

Прочие изменения:

  • Оптимизация постпроцессинга, особенно для обрезанных (cropped) изображений.
  • Кроппинг работает и для сенсоров FujiCCD. По ряду причин, позиция верхнего левого угла области кроппинга округляется до ближайшего меньшего целого числа кратного 4.
  • Новый пример samples/postprocessing_benchmark.cpp
    Позволяет оценить скорость этапа постпроцессинга. Поддерживает разные варианты интерполяции, кроппинг, averaged white balance, медианный фильтр, wavelet-фильтрацию и highlight recovery.
  • Отдельных буферов под черную (маскированную) рамку более не существует. Байеровские данные хранятся в буфере вместе с рамкой, а для остальных (полноцветных) форматов данных рамка несущественна. Как следствие, нет больше и отвратительного вызова LibRaw::add_masked_border_to_bitmap()
  • Параметра, управлявшего фильтрацией RAW-данных (params.filtering_mode) тоже больше нет с нами. Тоновая кривая RAW применяется всегда (для тех форматов, где она есть) на стадии распаковки, нулевые пикселы затираются усредненными соседними данными на стадии постпроцессинга (тоже, только для тех форматов, где есть проблема нулевых пикселов).
  • Удален вызов LibRaw::rotate_fuji_raw() и соответствующий ему вызов С API.
  • Примеры unprocessed_raw и 4colors используют новые форматы хранения RAW и новый вызов raw2image.
  • Структуры данных изменены, требуется перекомпиляция всех приложений.