В поставку 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; }[вернуться к оглавлению]