Historical beta reference. This page documents the deprecated
lightdrift-libraw/legacysurface. New applications should start with the stable documentation hub and API mapping.
The main class for processing RAW image files. It accepts complete file and buffer inputs; it does not incrementally decode a Node.js stream.
const LibRaw = require("lightdrift-libraw");
const processor = new LibRaw();Loads a RAW image file for processing.
Parameters:
filepath(string): Absolute path to the RAW image file
Returns: Promise<void>
Throws: Error if file cannot be loaded or is not supported
Example:
await processor.loadFile("/path/to/image.nef");Loads a RAW image from a memory buffer.
Parameters:
buffer(Buffer): Buffer containing RAW image data
Returns: Promise<void>
Example:
const rawData = fs.readFileSync("/path/to/image.nef");
await processor.loadBuffer(rawData);Closes the current image and frees resources.
Returns: Promise<void>
Example:
await processor.close();Extracts basic metadata from the loaded RAW image.
Returns: Promise<LibRawMetadata>
Example:
const metadata = await processor.getMetadata();
console.log(`Camera: ${metadata.make} ${metadata.model}`);
console.log(
`ISO: ${metadata.iso}, f/${metadata.aperture}, 1/${Math.round(
1 / metadata.shutterSpeed
)}s`
);Gets image dimensions and margin information.
Returns: Promise<LibRawImageSize>
Gets advanced metadata including color matrices and calibration data.
Returns: Promise<LibRawAdvancedMetadata>
Gets lens information from EXIF data.
Returns: Promise<LibRawLensInfo>
Gets color space and sensor information.
Returns: Promise<LibRawColorInfo>
Processes the RAW image with current settings.
Returns: Promise<void>
Example:
await processor.processImage();Unpacks thumbnail data from the RAW file.
Returns: Promise<void>
Sets output processing parameters.
Parameters:
params(Object): Processing parameters
Example:
await processor.setOutputParams({
bright: 1.1,
gamma: [2.2, 4.5],
output_bps: 16,
output_color: 1,
});Creates processed image in memory.
Returns: Promise<LibRawImageData>
Creates thumbnail image in memory.
Returns: Promise<LibRawImageData>
The buffer API provides modern, memory-based image processing perfect for web services, cloud applications, and real-time processing.
Creates a JPEG buffer with advanced compression options.
Parameters:
options(Object, optional): JPEG conversion optionsquality(number): JPEG quality 1-100 (default: 85)width(number): Target width (maintains aspect ratio)height(number): Target heightprogressive(boolean): Use progressive JPEG (default: false)mozjpeg(boolean): Use mozjpeg encoder (default: true)chromaSubsampling(string): '4:4:4', '4:2:2', or '4:2:0' (default: '4:2:0')colorSpace(string): 'srgb', 'rec2020', 'p3', 'cmyk' (default: 'srgb')fastMode(boolean): Optimize for speed (default: false)effort(number): Encoding effort 1-9 (default: 4)
Returns: Promise<LibRawBufferResult>
Example:
const result = await processor.createJPEGBuffer({
quality: 85,
width: 1920,
progressive: true,
});
// Use the buffer directly
res.set("Content-Type", "image/jpeg");
res.send(result.buffer);Creates a lossless PNG buffer.
Parameters:
options(Object, optional): PNG conversion optionswidth(number): Target widthheight(number): Target heightcompressionLevel(number): Compression level 0-9 (default: 6)progressive(boolean): Use progressive PNG (default: false)colorSpace(string): Output color space (default: 'srgb')
Returns: Promise<LibRawBufferResult>
Creates a modern WebP buffer with excellent compression.
Parameters:
options(Object, optional): WebP conversion optionsquality(number): Quality 1-100 (default: 80)width(number): Target widthheight(number): Target heightlossless(boolean): Use lossless compression (default: false)effort(number): Encoding effort 0-6 (default: 4)colorSpace(string): Output color space (default: 'srgb')
Returns: Promise<LibRawBufferResult>
Creates a next-generation AVIF buffer with superior compression.
Parameters:
options(Object, optional): AVIF conversion optionsquality(number): Quality 1-100 (default: 50)width(number): Target widthheight(number): Target heightlossless(boolean): Use lossless compression (default: false)effort(number): Encoding effort 0-9 (default: 4)colorSpace(string): Output color space (default: 'srgb')
Returns: Promise<LibRawBufferResult>
Creates a high-quality TIFF buffer for professional workflows.
Parameters:
options(Object, optional): TIFF conversion optionswidth(number): Target widthheight(number): Target heightcompression(string): 'none', 'lzw', 'jpeg', 'zip' (default: 'lzw')quality(number): JPEG quality when using JPEG compression (default: 90)pyramid(boolean): Create pyramidal TIFF (default: false)colorSpace(string): Output color space (default: 'srgb')
Returns: Promise<LibRawBufferResult>
Creates a raw PPM buffer for further processing.
Returns: Promise<LibRawBufferResult>
Creates an optimized thumbnail JPEG buffer.
Parameters:
options(Object, optional): Thumbnail optionsquality(number): JPEG quality 1-100 (default: 85)maxSize(number): Maximum dimension (width or height)
Returns: Promise<LibRawBufferResult>
Writes processed image as PPM file.
Parameters:
filename(string): Output file path
Returns: Promise<void>
Writes processed image as TIFF file.
Parameters:
filename(string): Output file path
Returns: Promise<void>
Writes thumbnail as JPEG file.
Parameters:
filename(string): Output file path
Returns: Promise<void>
Converts RAW to JPEG file with advanced options.
Parameters:
outputPath(string): Output file pathoptions(Object, optional): Same ascreateJPEGBufferoptions
Returns: Promise<LibRawJPEGResult>
Example:
const result = await processor.convertToJPEG("./output.jpg", {
quality: 90,
width: 2400,
});
console.log(`Saved: ${result.outputPath}`);Checks if image uses floating point data.
Returns: Promise<boolean>
Checks if image is from Fuji camera and rotated.
Returns: Promise<boolean>
Checks if image is sRAW format.
Returns: Promise<boolean>
Checks if file contains JPEG thumbnail.
Returns: Promise<boolean>
Gets current error count.
Returns: Promise<number>
Gets LibRaw library version.
Returns: string
Gets LibRaw library capabilities bitmask.
Returns: number
Gets list of supported camera models.
Returns: string[]
Gets count of supported camera models.
Returns: number
All buffer methods return a LibRawBufferResult object:
{
success: true,
buffer: Buffer, // The actual image data
metadata: {
originalDimensions: { width: 8192, height: 5464 },
outputDimensions: { width: 1920, height: 1280 },
fileSize: {
original: 134217728,
compressed: 1048576,
compressionRatio: "128.0"
},
processing: {
timeMs: "450.25",
throughputMBps: "297.3"
},
jpegOptions: { /* applied options */ }
}
}const processor = new LibRaw();
await processor.loadFile("input.cr2");
await processor.processImage();
await processor.writeTIFF("output.tiff");
await processor.close();const processor = new LibRaw();
await processor.loadFile("input.cr2");
// Create multiple formats in parallel
const [jpeg, webp, thumbnail] = await Promise.all([
processor.createJPEGBuffer({ quality: 85, width: 1920 }),
processor.createWebPBuffer({ quality: 80, width: 1920 }),
processor.createThumbnailJPEGBuffer({ maxSize: 300 }),
]);
// Use buffers directly (no file I/O)
await uploadToCloud("image.jpg", jpeg.buffer);
await uploadToCloud("image.webp", webp.buffer);
await uploadToCloud("thumb.jpg", thumbnail.buffer);
await processor.close();app.post("/convert", async (req, res) => {
const processor = new LibRaw();
try {
await processor.loadBuffer(req.body);
const result = await processor.createJPEGBuffer({
quality: 85,
width: 1920,
});
res.set("Content-Type", "image/jpeg");
res.send(result.buffer);
} finally {
await processor.close();
}
});Always wrap LibRaw operations in try/catch blocks and ensure proper cleanup:
const processor = new LibRaw();
try {
await processor.loadFile("input.cr2");
const result = await processor.createJPEGBuffer({ quality: 85 });
return result;
} catch (error) {
console.error("Processing failed:", error.message);
throw error;
} finally {
await processor.close(); // Always cleanup
}Gets the dimensions of the loaded RAW image.
Returns: Promise<LibRawImageSize>
Example:
const size = await processor.getImageSize();
console.log(`Resolution: ${size.width}x${size.height}`);Closes the processor and frees resources.
Returns: Promise<void>
Example:
await processor.close();interface LibRawMetadata {
make: string; // Camera manufacturer
model: string; // Camera model
iso: number; // ISO sensitivity
aperture: number; // Aperture f-number
shutterSpeed: number; // Shutter speed in seconds
focalLength: number; // Focal length in mm
timestamp: number; // Unix timestamp
colors: number; // Number of color channels
filters: number; // Color filter pattern
description?: string; // Camera description
artist?: string; // Photographer name
copyright?: string; // Copyright info
}interface LibRawImageSize {
width: number; // Image width in pixels
height: number; // Image height in pixels
}| Format | Extension | Manufacturer | Description |
|---|---|---|---|
| NEF | .nef | Nikon | Nikon Electronic Format |
| CR2/CR3 | .cr2/.cr3 | Canon | Canon RAW version 2/3 |
| ARW | .arw | Sony | Sony Alpha RAW |
| RAF | .raf | Fujifilm | Fuji RAW Format |
| RW2 | .rw2 | Panasonic | Panasonic RAW version 2 |
| DNG | .dng | Adobe/Various | Digital Negative (Adobe) |
All methods return Promises and may throw errors. Always use try-catch or .catch():
try {
await processor.loadFile("image.nef");
const metadata = await processor.getMetadata();
console.log(metadata);
} catch (error) {
console.error("Processing failed:", error.message);
} finally {
await processor.close();
}const LibRaw = require("lightdrift-libraw");
async function processRAWFile(filepath) {
const processor = new LibRaw();
try {
// Load the RAW file
await processor.loadFile(filepath);
// Extract metadata
const metadata = await processor.getMetadata();
const size = await processor.getImageSize();
// Display information
console.log(`Camera: ${metadata.make} ${metadata.model}`);
console.log(`Resolution: ${size.width}x${size.height}`);
console.log(
`Settings: ISO ${metadata.iso}, f/${metadata.aperture}, 1/${Math.round(
1 / metadata.shutterSpeed
)}s`
);
return { metadata, size };
} catch (error) {
console.error("Error processing file:", error.message);
throw error;
} finally {
// Always cleanup
await processor.close();
}
}
// Usage
processRAWFile("/path/to/image.nef")
.then((result) => console.log("Processing complete"))
.catch((error) => console.error("Failed:", error));