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

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

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

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

Пример 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; 
        }
    }
   // Распаковка данных
   if(OUT.document_mode)
           ret = RawProcessor.dcraw_document_mode_processing();
   else
           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;
}
[вернуться к оглавлению]
LibRaw Team
Last modified: Thu Dec 9 14:13:08 UTC 2010