| <html> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=windows-1252"> |
| </head> |
| <body> |
| <p>LibRaw: Usage Examples<a href="index.html">[back to Index]</a></p> |
| <h1>LibRaw: Usage Examples</h1> |
| <h2>Overview of Examples in the Distribution Package (samples/*)</h2> |
| <p>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:</p> |
| <ul> |
| <li><strong>raw-identify</strong> The only LibRaw call it uses is <a href="API-CXX.html#open_file">open_file()</a>; |
| further code prints the values of the fields of the imgdata structure. <strong><br> |
| </strong><strong>raw-identify -v</strong> provides extensive dump of |
| metadata/<br> |
| Command line key <strong>-u</strong> shows unpacking function name, |
| while <strong>-u -f</strong> prints function name and masked are sizes.<br> |
| <strong>raw-identify -w </strong>will print white balance tables stored |
| in RAW file.</li> |
| <li><strong>simple_dcraw</strong> A simple "emulation" of dcraw |
| reproducing the behavior of <strong>dcraw [-e] [-v] [-T]</strong>. |
| A simplified version of this example is <a href="#code">considered |
| below</a>. <br> |
| <strong>-B</strong> command-line switch turns on use of <a href="API-CXX.html#open_buffer">open_buffer() |
| API call</a> used via mmap() of input file (Unix only).</li> |
| <li><strong>dcraw_half</strong> Demonstrates the use of <a href="API-C.html">C |
| API</a>. The example emulates the behavior of <strong>dcraw -h</strong> |
| (no other control parameters can be specified in this example). </li> |
| <li><strong>dcraw_emu</strong> Almost complete emulation of dcraw (except for |
| keys -D -d -E -i -v -e, which are considered in other usage examples). |
| Of most interest is processing of command line keys (copied from dcraw). |
| <br> |
| <p>This sample supports additional command-line parameters absent in |
| original dcraw:</p> |
| <dl> |
| <dt><strong>-mmap</strong></dt> |
| <dd>Use <a href="API-CXX.html#open_buffer">open_buffer()</a> |
| interface. Buffer prepared by mmap() call. This option not supported |
| under Win32.</dd> |
| <dt><strong>-meme</strong></dt> |
| <dd>Use <a href="API-CXX.html#open_buffer">open_buffer()</a> |
| interface. Buffer prepared by malloc()+read() calls.</dd> |
| <dt><strong>-c float-value</strong></dt> |
| <dd>This key sets <strong>params.adjust_maximum_thr</strong> |
| parameter.<br> |
| Use -c 0 to completely disable automatic maximum calculation. <br> |
| Default value: 0.75</dd> |
| <dt><strong>-timing</strong></dt> |
| <dd>Turns on detailed timing print.</dd> |
| <dt><strong>-G</strong></dt> |
| <dd>Turns on "green_matching" mode to suppress color mazes on cameras |
| with different green channels.</dd> |
| <dt><strong>-B x y w h</strong></dt> |
| <dd>Crops output to rectangle with width w, height h and x,y |
| coordinates of left upper corner. All coordinates applied before any |
| image rotation.</dd> |
| <dt><strong>-F</strong></dt> |
| <dd>Will use FILE I/O (bigfile_datastream) instead on standard |
| LibRaw_file_datastream.</dd> |
| <dt><strong>-dcbi N</strong></dt> |
| <dd>Sets number of additional DCB-demosaic iterations (option valid |
| only for -q 4, i.e. for DCB demosaic).</dd> |
| <dt><strong>-dcbe</strong></dt> |
| <dd>Turns on DCB color enhance mode (only for DCB demosaic, -q 4).</dd> |
| <dt><strong>-aexpo e p</strong></dt> |
| <dd>Turns on exposure correction. e is exposure shift in linear scale |
| from 0.25 (darken 2 stops) to 8.0 (lighten 3 stops). p is highlights |
| preservation amount from 0.0 (no preservation, full clipping) to 1.0 |
| (full preservation, S-like curve in highlights).</dd> |
| <dt><strong>-apentax4shot</strong></dt> |
| <dd>Will merge 4 frames from Pentax 4-shot RAWs</dd> |
| <dt><strong>-apentax4shotorder abce</strong></dt> |
| <dd>Order of frames in pentax 4-shot files (default is 3102)</dd> |
| <dt><strong>-mmap</strong></dt> |
| <dd>Use mmap + memory IO instead of file IO (unix only)</dd> |
| <dt><strong>-disars</strong></dt> |
| <dd>Disable RawSpeed library (if compiled with this library)</dd> |
| <dt><strong>-doutputflags N</strong></dt> |
| <dd>set imgdata.params.output_flags to N</dd> |
| <dt><strong>-disinterp</strong></dt> |
| <dd>Do not run interpolation step</dd> |
| <dt><strong>-dsrawrgb1</strong></dt> |
| <dd>Disable YCbCr to RGB conversion for sRAW (Cb/Cr interpolation |
| enabled)</dd> |
| <dt><strong>-dsrawrgb2</strong></dt> |
| <dd>Disable YCbCr to RGB conversion for sRAW (Cb/Cr interpolation |
| disabled)</dd> |
| </dl> |
| </li> |
| <li><strong>half_mt</strong> Emulation of <strong>dcraw -h</strong>. It |
| "understands" the following keys: -a (automatic white balance over the |
| entire image), -w (white balance of the camera), -T (output in the tiff |
| format), and -J n (number of parallel threads launched for image |
| processing).<br> |
| On multiprocessor/multicore computers, the speed gain is notable in the |
| case of mass processing. On a Win32 machine, the example is assembled |
| from the initial file half_mt_win32.c, since work with threads under |
| Windows is fundamentally different and it it easier to copy simple |
| source codes than write one complex code.</li> |
| <li><strong>mem_image</strong> This sample uses <a href="API-CXX.html#dcraw_make_mem_image">dcraw_make_mem_image</a> |
| and <a href="API-CXX.html#dcraw_make_mem_thumb">dcraw_make_mem_thumb</a> |
| calls, than writes data in PPM format. </li> |
| <li><strong>unprocessed_raw</strong> This sample extracts (mostly) |
| unaltered RAW data including masked pixels data (on supported cameras). |
| If black frame exists and black frame extraction is supported for given |
| format, masked pixels data is added to resulting .TIFF file. Command |
| line options: <strong>-q</strong> - be quiet, <strong>-A</strong> - |
| autoscale data (integer multiplier), <strong>-g</strong> |
| gamma-correction (gamma 2.2) for data (instead of precise linear one), <strong>-B</strong> |
| turns on black level subtraction</li> |
| <li><strong>4channnels</strong> - splits RAW-file into four separate |
| 16-bit grayscale TIFFs (per RAW channel).<br> |
| Command line switches: |
| <ul> |
| <li><strong>-s N</strong> selects N-th image from RAW with multiple |
| images</li> |
| <li><strong>-g</strong> gamma correction (gamma 2.2)</li> |
| <li><strong>-A</strong> values autoscale by auto-calculated integer |
| factor</li> |
| <li><strong>-B</strong> turn off black subtraction</li> |
| <li><strong>-N</strong> no RAW curve</li> |
| </ul> |
| </li> |
| <li><strong>multirender_test</strong> - very simple example of multiple |
| rendering on one file without reopen.</li> |
| <li><strong>postprocessing_benchmark</strong> - will print timings of RAW |
| processing steps</li> |
| </ul> |
| <h2>Example of docmode</h2> |
| <p>Below we consider the samples/simple_dcraw.cpp example, which emulates |
| the behavior of <strong>dcraw [-e][-v][-t]</strong>. 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.</p> |
| <pre>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; |
| } |
| </pre> |
| <p><a href="index.html">[back to Index]</a></p> |
| </body> |
| </html> |