Convert RAW camera images using JavaScript

  • dcraw

Downloads in past


1.0.35 years ago5 years agoMinified + gzip package size for dcraw in KB


Convert RAW camera images using JavaScript (supported on Node.js and your Browser)
This project is a port of dcraw.c using Emscripten.



npm install dcraw


<script src="https://cdn.jsdelivr.net/npm/dcraw"></script>


Read a RAW image file into a buffer (or Uint8Array in the browser, see browser example here)
const fs = require('fs');
const buf = fs.readFileSync('./example.CR2');
Get Image Metadata
Parse the file for metadata
const dcraw = require('dcraw');
dcraw(buf, { verbose: true, identify: true });

>   Filename: raw_buf
    Timestamp: Thu Sep 21 07:17:42 2017
    Camera: Canon EOS 20D
    Owner: unknown
    ISO speed: 3200
    Shutter: 252.0 sec
    Aperture: f/inf
    Focal length: 0.0 mm
    Embedded ICC profile: no
    Number of raw images: 1
    Thumb size:  1536 x 1024
    Full size:   3596 x 2360
    Image size:  3522 x 2348
    Output size: 3522 x 2348
    Raw colors: 3
    Filter pattern: RG/GB
    Daylight multipliers: 2.098645 0.930145 1.180146
    Camera multipliers: 1021.000000 1015.000000 1018.000000 1015.000000
Convert to TIFF
Convert to TIFF file, and save to disk
const tiffFile = dcraw(buf, { exportAsTiff: true });
fs.writeFileSync('example.tiff', tiffFile)


You may use the same options that dcraw supports by providing the flags directly, or you may use the following human friendly versions.
// The following dcraw command, can be written two ways using dcraw.js
// dcraw -T -4 -E <filename>

// Both of these do the same thing
dcraw(buf, { T: true, 4: true, E: true });
dcraw(buf, { exportAsTiff: true, use16BitLinearMode: true, useExportMode: true });
Options List
|Option|Type|Description| |------|----|-----------| |verbose|boolean|Print verbose messages| |identify|boolean|Identify files without decoding them (use with '-v' to identify files and show metadata)| |extractThumbnail|boolean|Extract embedded thumbnail image| |useCameraWhiteBalance|boolean|Use camera white balance, if possible| |useAverageWhiteBalance|boolean|Average the whole image for white balance| |whiteBalanceBox|x y w h|Average a grey box for white balance| |useCustomWhiteBalance|r g b g|Set custom white balance| |useEmbeddedColorMatrix|boolean|Use/don't use an embedded color matrix| |correctChromaticAberration|r b |Correct chromatic aberration| |deadPixelFile|buffer |Fix the dead pixels listed in this file| |darkFrameFile|buffer |Subtract dark frame (16-bit raw PGM)| |setDarknessLevel|num |Set the darkness level| |setSaturationLevel|num |Set the saturation level| |setWaveletThreshold|num |Set threshold for wavelet denoising| |setHighlightMode|0-9 |Highlight mode (0=clip, 1=unclip, 2=blend, 3+=rebuild)| |setFlipMode|0-7 |Flip image (0=none, 3=180, 5=90CCW, 6=90CW)| |setColorSpace|0-6 |Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ,ACES)| |setICCFromFile|buffer |Apply output ICC profile from file| |setICCFromCamera|buffer |Apply camera ICC profile from file or "embed"| |useDocumentMode|boolean|Document mode (no color, no interpolation, no debayer)| |useRawMode|boolean|Document mode without scaling (totally raw)| |useExportMode|boolean|Document mode without cropping| |setNoStretchMode|boolean|Don't stretch or rotate raw pixels| |setNoAutoBrightnessMode|boolean|Don't automatically brighten the image| |setBrightnessLevel|num |Adjust brightness (default = 1.0)| |setCustomGammaCurve|p ts |Set custom gamma curve (default = 2.222 4.5)| |setInterpolationQuality|0-3 |Set the interpolation quality| |setHalfSizeMode|boolean|Half-size color image (twice as fast as "-q 0")| |setFourColorMode|boolean|Interpolate RGGB as four colors| |setMedianFilter|num |Apply a 3x3 median filter to R-G and B-G| |setImageCount|0..N-1 |Select one raw image or "all" from each file| |use16BitMode|boolean|Write 16-bit instead of 8-bit| |use16BitLinearMode|boolean|Linear 16-bit, same as "-6 -W -g 1 1"| |exportAsTiff|boolean|Write TIFF instead of PPM|

Browser Example

You'll need to do a little bit of work to get a file buffer on the browser. There is a full example available here.
var reader = new FileReader();

reader.onload = function (e) {
    // Get the image file as a buffer
    var buf = new Uint8Array(e.currentTarget.result);

    // Get the RAW metadata
    const metadata = dcraw(buf, { verbose: true, identify: true });