В поставку LibRaw включено несколько примеров использования библиотеки, их исходные тексты расположены в каталоге samples/, после сборки они оказываются в каталоге bin/:
Этот пример поддерживает дополнительные ключи, отсутствующие в оригинальной 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;
}
[вернуться к оглавлению]