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');
Parse the file for metadata
const dcraw = require('dcraw');
dcraw(buf, { verbose: true, identify: true });
Result
> 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 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 });
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 |
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 });
};
reader.readAsArrayBuffer(file);