LibRaw: Usage Examples[back to Index]
The LibRaw package contains several examples illustrating the use of this library. Their source codes are located in the samples/ folder, and after library build they will be in the bin/ folder:
This sample supports additional command-line parameters absent in original dcraw:
Below we consider the samples/simple_dcraw.cpp example, which emulates the behavior of dcraw [-e][-v][-t]. To save space, let us assume that keys -t -v are always specified (to avoid comments on command line parsing) and there is always one parameter (name of file), which is the only one and always passed to the program.
int main(int ac, char *av[]) { int i, ret, verbose=0, output_thumbs=0; char outfn[1024],thumbfn[1024]; // Creation of image processing object LibRaw RawProcessor; // The date in TIFF is written in the local format; let us specify the timezone for compatibility with dcraw putenv ((char*)"TZ=UTC"); // Let us define variables for convenient access to fields of 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; // Let us output TIFF // Let us open the file if( (ret = RawProcessor.open_file(av[1])) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot open %s: %s\n",av[i],libraw_strerror(ret)); // recycle() is needed only if we want to free the resources right now. // If we process files in a cycle, the next open_file() // will also call recycle(). If a fatal error has happened, it means that recycle() // has already been called (repeated call will not cause any harm either). RawProcessor.recycle(); goto end; } // Let us unpack the image 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; // if there has been a non-fatal error, we will try to continue } // Let us unpack the thumbnail if( (ret = RawProcessor.unpack_thumb() ) != LIBRAW_SUCCESS) { // error processing is completely similar to the previous case fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) goto end; } else // We have successfully unpacked the thumbnail, now let us write it to a file { 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)); // in the case of fatal error, we should terminate processing of the current file if(LIBRAW_FATAL_ERROR(ret)) goto end; } } // Data unpacking ret = RawProcessor.dcraw_process(); if(LIBRAW_SUCCESS != ret ) // error at the previous step { fprintf(stderr,"Cannot do postprocessing on %s: %s\n",av[i],libraw_strerror(ret)); if(LIBRAW_FATAL_ERROR(ret)) goto end; } else // Successful document processing { 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); } // we don't evoke recycle() or call the destructor; C++ will do everything for us return 0; end: // got here after an error return 1; }