[вернуться к оглавлению]

# LibRaw: примеры использования

## Обзор примеров в дистрибутиве (samples/*)

В поставку LibRaw включено несколько примеров использования библиотеки, их исходные тексты расположены в каталоге samples/, после сборки они оказываются в каталоге bin/:

- raw-identify Из вызовов LibRaw используется только open_file(), далее идет код, печатающий значения полей структуры imgdata. Выдача raw-identify/raw-identify -v практически полностью копирует выдачу dcraw -i/dcraw -i -v (в выдаче примера дополнительно печатаются источники цветовых данных и легенда к ним).

  Дополнительные параметры, отсутствующие у dcraw: -u - печатать имя функции - распаковщика данных; -u -f - печатать имя распаковщика и размер черной (маскированной) рамки.

- simple_dcraw Простой "эмулятор" dcraw, воспроизводящий поведение dcraw [-D] [-e] [-v] [-T]. Результат работы должен бинарно совпадать с результатами работы dcraw запущенной с нужными ключами. Упрощенный вариант этого примера рассмотрен ниже.
  Ключ -B включает использование интерфейса open_buffer() куда передается mmap()-ed файл (Unix only).
- dcraw_half Демонстрация использования C API. Пример эмулирует поведение dcraw -h (какие-то еще управляющие параметры этому примеру задать нельзя). Результат работы должен бинарно совпадать с результатами работы dcraw -h.
- dcraw_emu Полный эмулятор dcraw (за исключением ключей -D -d -P -K -i -e, которые обрабатываются в других примерах использования). Основной интерес представляет обработка ключей командной строки (скопированная из dcraw). Результат работы должен бинарно совпадать с результатом работы dcraw с теми же ключами командной строки.

  Этот пример поддерживает дополнительные ключи, отсутствующие в оригинальной dcraw:

  -mmap
    Включает использование интерфейса open_buffer() куда передается mmap()-ed файл (Unix only).
  -mem
    Входной файл читается в буфер в памяти и раскодируется оттуда.
  -c значение в диапазоне 0-1
    Ключ меняет значение параметра params.adjust_maximum_thr. Для отключения автоматического вычисления максимума, поставьте этот параметр в 0.0.
    Умолчание: 0.75
  -timing
    Включает тайминг отдельных этапов обработки.
  -G
    Включает green_matching: выравнивание каналов зеленого для тех камер, где эти каналы различаются.
  -B x y w h
    Включает обрезание (cropping) выходного изображения до прямоугольника с верхним левым углом в x,y шириной w и высотой h. Координаты и размеры - до поворотов изображения (если применяются повороты).
  -dcbi N
    Устанавливает количество дополнительных итераций алгоритма DCB (только для -q 4). Умолчание - 0 (нет дополнительных итераций)
  -dcbe
    Включает режим DCB color enhance (только для -q 4).
  -eeci
    Включает режим EECI refine (только для mixed VCD/AHD -q 8)
  -esmed N
    Количество проходов edge-sensitive median filter для интерполяции VCD+AHD
  -acae r b
    Включает режим подавления хроматической аберрации. Параметры r и b означают величину коррекции по красной и синей осям. Эти параметры обязательны, для автоматической коррекции следует использовать -acae 0 0
  -aline l
    Включает режим подавления полосатости (banding). l - степень подавления шума, диапазон значений 0.001-0.02, типичное значение 0.005
  -aclean l c
    Включает режим подавления импульсного шума. l - степень подавления яркостного (luminocity) шума, c - цветового (chrominance) шума. Разумный диапазон значений обоих параметров 0.005-0.05, типовое - 0.01.
  -agreen g
    Включает режим выравнивания зеленых каналов на равномерных поверхностях. g - степень чувствительности алгоритма, диапазон значений 0.01-0.1, типичное значение 0.03.
  -aexpo e p
    Включает экспокоррекцию (до демозаики). e - величина экспокоррекции (в линейной шкале), диапазон от 0.25 (-2 стопа) до 8 (+3 стопа). p - степень предохранения светов при положительной экспокоррекции, диапазон от 0.0 (просто линейный сдвиг данных с клиппингом) до 1.0 (полное отсутствие дополнительного клиппинга от экспокоррекции).
- half_mt Эмулятор dcraw -h, понимает ключи -a (автоматический баланс белого по всему изображению), -w (баланс белого камеры), -T (выводить в tiff) и -J n - количество параллельных threads, запускаемых для обработки изображений.
  На мультипроцессорных/multicore машинах дает существенный выигрыш в скорости при массовой обработке.
  На Win32-машине пример собирается из исходного файла half_mt_win32.c, причина в том, что работа с threads на Windows принципиально другая и проще размножить простые исходники, чем написать один сложный.
- mem_image Пример использования функций dcraw_make_mem_image и dcraw_make_mem_thumb: распаковка изображений и preview() в память с последующей простой записью в форматах PPM (и JPEG для thumbnail). Результат работы должен быть идентичен результатам работы dcraw с теми же ключами (поддерживаются ключи -4, -1, -e, -h).
- unprocessed_raw - извлечение максимально неизмененных RAW-данных, без вычитания уровня черного и маскирования черных пикселов (на тех камерах, где возможно маскирование). Для тех камер, которые выдают в RAW-данные черную рамку (маскированные пикселы) - рамка включается в выдаваемые данные. Ключи командной строки: -q - не выдавать текстовую справку о размерах файла, -A - автомасштабирование данных в целое число раз, -g выдавать гамма-корректированные (2.2) данные, а не линейные, -N - выключает наложение тоновой кривой на RAW-данные, -B включает вычитание уровня черного из данных, -M добавляет маскированную рамку к результирующему изображению.
- 4channnels - сохраняет RAW-файл в виде 4 отдельных 16-битных grayscale TIFF-файлов (поканально).
  Ключи командной строки:
  - -s N выбрать N-е изображение (для файлов с несколькими изображениями)
  - -g выводить гамма-корректированное (2.2) изображение
  - -A автомасштабирование значений в целое число раз
  - -B отключить вычитание уровня черного
  - -N отключить тоновую кривую для RAW
- multirender_test - простой пример, показывающий возможность множественной постобработки с разными параметрами без переоткрытия файла.

## Пример simple_dcraw

Ниже рассмотрен пример samples/simple_dcraw.cpp - эмулирующий поведение dcraw [-D] [-e][-v][-t]. Для экономии места представим, что всегда заданы ключи -t -v (чтобы не комментировать разбор командной строки) и что параметр (имя файла) всегда один и всегда передается.

    int main(int ac, char *av[])
    {
        int  i, ret, verbose=0, output_thumbs=0;
        char outfn[1024],thumbfn[1024];

        // Создадим объект - обработчик изображений.
        LibRaw RawProcessor;

        // В TIFF пишется дата в локальном формате, для совместимости с dcraw поставим таймзону
        putenv ((char*)"TZ=UTC");

    // Определим переменные для удобного доступа к полям RawProcessor
    #define P1  RawProcessor.imgdata.idata
    #define S   RawProcessor.imgdata.sizes
    #define C   RawProcessor.imgdata.color
    #define T   RawProcessor.imgdata.thumbnail
    #define P2  RawProcessor.imgdata.other
    #define OUT RawProcessor.imgdata.params

        OUT.output_tiff = 1; // Выводить будем TIFF

       // Откроем файл
       if( (ret = RawProcessor.open_file(av[1])) != LIBRAW_SUCCESS)
          {
              fprintf(stderr,"Cannot open %s: %s\n",av[i],libraw_strerror(ret));

              // recycle() нужен только если мы хотим освободить ресурсы прямо сейчас.
              // Если мы обрабатываем файлы в цикле, то следующий open_file()
              // тоже вызовет recycle. Если случилась фатальная ошибка, то recycle()
              // уже вызван (вреда от повторного вызова тоже нет)

              RawProcessor.recycle();
              goto end;
          }

       // Распакуем изображение
       if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS)
          {
              fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));

              if(LIBRAW_FATAL_ERROR(ret))
                        goto end;
              // для нефатальной ошибки - пробуем продолжить
          }
      // Распакуем thumbnail
      if( (ret = RawProcessor.unpack_thumb() ) != LIBRAW_SUCCESS)
         {
              // обработка ошибки полностью аналогична предыдущему случаю
               fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));
               if(LIBRAW_FATAL_ERROR(ret))
                       goto end;
        }
      else // Успешно распаковали thumbnail, запишем его в файл
        {
          snprintf(thumbfn,sizeof(thumbfn),"%s.%s",av[i],T.tformat == LIBRAW_THUMBNAIL_JPEG ? "thumb.jpg" : "thumb.ppm");
          if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_thumb_writer(thumbfn)))
            {
                    fprintf(stderr,"Cannot write %s: %s\n",thumbfn,libraw_strerror(ret));

                    // в случае фатальной ошибки мы должны заканчивать обработку текущего файла
                    if(LIBRAW_FATAL_ERROR(ret))
                              goto end;
            }
        }
       // Распаковка данных
       ret = RawProcessor.dcraw_process();

        if(LIBRAW_SUCCESS != ret ) // ошибка на предыдущем шаге
              {
                   fprintf(stderr,"Cannot do postprocessing on %s: %s\n",av[i],libraw_strerror(ret));
                   if(LIBRAW_FATAL_ERROR(ret))
                            goto end;
              }
       else  // Успешная обработка документа
         {
            snprintf(outfn,sizeof(outfn),"%s.%s", av[i], "tiff");
            if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn)))
                    fprintf(stderr,"Cannot write %s: error %d\n",outfn,ret);
         }

      // Не делаем recycle, не зовем деструктор, C++ все делает за нас.
      return 0;
    end:
      // сюда попали после ошибки
      return 1;
    }

[вернуться к оглавлению]

Last modified: Mon Jul 11 20:23:33 MSD 2011