Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

librawspeed

pixFlowTeam2.9kMIT1.0.129TypeScript support: included

Node.js Native Addon for LibRaw - Process RAW image files with JavaScript

libraw, raw, image, photography, native-addon, nef, cr2, cr3, arw, dng, raf, rw2, metadata, exif, canon, nikon, sony, fujifilm, panasonic, leica, adobe-dng, jpeg, jpeg-conversion, image-conversion, batch-processing, sharp, mozjpeg, compression, optimization, resize, quality

readme

LibRaw Node.js

一个使用 LibRaw 库处理 RAW 图像文件的高性能 Node.js 原生插件。

npm version Node.js Version License: MIT Build Status NPM Downloads

功能特性

  • 100+ RAW 格式 - Canon、Nikon、Sony、Adobe DNG 等
  • 全面的元数据 - EXIF 数据、相机设置、尺寸、镜头信息
  • 高级色彩信息 - 色彩矩阵、白平衡、校准数据
  • 图像处理管道 - 完整的 dcraw 兼容处理链
  • 缩略图提取 - 高质量嵌入式缩略图提取
  • RAW 转 JPEG 转换 - 🆕 高性能 JPEG 导出与优化
  • 批量处理 - 🆕 使用智能设置处理数百个文件
  • AI 驱动设置 - 🆕 基于图像分析的自动质量优化
  • 内存操作 - 完全在内存中处理图像
  • 多种输出格式 - PPM、TIFF、JPEG 与高级压缩选项
  • 缓冲区创建 API - 🆕 直接在内存中创建图像缓冲区(JPEG、PNG、WebP、AVIF、TIFF、PPM、缩略图)
  • 基于流的处理 - 🆕 返回数据流而不是写入文件
  • 缓冲区支持 - 从内存缓冲区加载 RAW 数据
  • 配置控制 - 伽马、亮度、色彩空间设置
  • 高性能 - 原生 C++ 处理与 JavaScript 便利性
  • 内存高效 - 适当的资源管理和清理
  • 基于 Promise 的 API - 现代 async/await 支持
  • 跨平台 - Windows、macOS、Linux 支持(已测试 Windows)
  • 1000+ 相机支持 - LibRaw 的广泛相机数据库
  • 全面测试 - 使用真实 RAW 文件 100% 测试覆盖
  • 生产就绪 - 经过多种相机格式实战测试

支持的格式

LibRaw 支持 100+ RAW 格式,包括:

制造商 格式
佳能 .CR2, .CR3, .CRW
尼康 .NEF, .NRW
索尼 .ARW, .SRF, .SR2
Adobe .DNG
富士 .RAF
奥林巴斯 .ORF
松下 .RW2
宾得 .PEF
徕卡 .DNG, .RWL
还有更多... 总共 100+ 格式

安装

📦 从 NPM 注册表

npm install librawspeed

版本 1.0.18 现已在 npmjs.com 上可用!🎉

🛠️ 构建要求

  • Node.js 14.0.0 或更高版本
  • Python 2.7 或 3.x(用于 node-gyp)
  • C++ 编译器
    • Windows: Visual Studio Build Tools 或 Visual Studio Community
    • macOS: Xcode Command Line Tools 或 Xcode
    • Linux: build-essential 包

💡 提示:node-gyp 会自动处理构建工具,无需手动安装 make 等工具

🔧 环境检查

安装前可以检查环境是否满足要求:

npm run check:env

⚠️ 故障排除

如果安装失败,请尝试:

# 清理并重新安装
npm run clean
npm run rebuild

# 或强制重新构建
npm install --force

常见问题:

  1. Python 未找到

    npm config set python python3
  2. 编译器未找到

    # Windows
    npm install --global windows-build-tools
    
    # macOS
    xcode-select --install
    
    # Linux
    sudo apt-get install build-essential

🚀 快速验证

安装后,验证包是否正常工作:

node -e "const LibRaw = require('librawspeed'); console.log('LibRaw version:', LibRaw.getVersion());"

预期输出:LibRaw version: 0.21.4-Release

先决条件(从源码构建)

  • Node.js 14.0.0 或更高版本
  • Python 3.x(用于 node-gyp)
  • Visual Studio Build Tools(Windows)
  • Xcode Command Line Tools(macOS)
  • build-essential(Linux)

🛠️ 交叉编译支持

此项目支持多平台交叉编译。有关详细工具链要求和设置说明,请参阅交叉编译指南

支持的平台:

  • ✅ Windows x64
  • ✅ macOS x64(Intel)
  • ✅ macOS ARM64(Apple Silicon)
  • ✅ Linux x64
  • ✅ Linux ARM64

快速设置:

# 安装所有交叉编译工具链
brew install mingw-w64 aarch64-apple-darwin24-gcc-15 musl-cross

# 构建所有平台
npm run cross-compile:all

快速开始

const LibRaw = require("librawspeed");

async function processRAW() {
  // 🆕 检查文件是否为 LibRaw 支持的 RAW 格式
  const checkResult = LibRaw.isRawFile('photo.cr2');
  if (!checkResult.isRawFile) {
    console.log('不是支持的 RAW 文件:', checkResult.message);
    return;
  }

  const processor = new LibRaw();

  try {
    // 加载 RAW 文件
    await processor.loadFile("photo.cr2");

    // 🆕 新功能:缓冲区创建 API - 直接在内存中创建图像
    // 首先处理 RAW 数据
    await processor.processImage();

    // 创建 JPEG 缓冲区而不写入文件
    const jpegBuffer = await processor.createJPEGBuffer({
      quality: 85,
      width: 1920,
      progressive: true,
    });

    console.log(`JPEG 缓冲区已创建:${jpegBuffer.buffer.length} 字节`);

    // 并行创建多种格式
    const [pngResult, webpResult, thumbResult] = await Promise.all([
      processor.createPNGBuffer({ width: 1200, compressionLevel: 6 }),
      processor.createWebPBuffer({ quality: 80, width: 1200 }),
      processor.createThumbnailJPEGBuffer({ maxSize: 300 }),
    ]);

    // 直接使用缓冲区(例如,通过 HTTP 发送、存储到数据库等)
    // 无需临时文件!

    console.log(`PNG:${pngResult.buffer.length} 字节`);
    console.log(`WebP:${webpResult.buffer.length} 字节`);
    console.log(`缩略图:${thumbResult.buffer.length} 字节`);

    // 🆕 新功能:高性能 JPEG 转换(传统方法仍然可用)
    // 使用高级选项将 RAW 转换为 JPEG
    const jpegResult = await processor.convertToJPEG("output.jpg", {
      quality: 85, // JPEG 质量(1-100)
      width: 1920, // 调整到 1920px 宽度
      progressive: true, // 用于网络的渐进式 JPEG
      mozjpeg: true, // 使用 MozJPEG 获得更好的压缩
      chromaSubsampling: "4:2:0", // 优化文件大小
    });

    console.log(
      `JPEG 已保存:${jpegResult.metadata.fileSize.compressed / 1024}KB`
    );
    console.log(
      `压缩率:${jpegResult.metadata.fileSize.compressionRatio}x`
    );
    console.log(`处理时间:${jpegResult.metadata.processing.timeMs}ms`);

    // 🆕 AI 驱动的优化设置
    const analysis = await processor.getOptimalJPEGSettings({ usage: "web" });
    console.log(`推荐质量:${analysis.recommended.quality}`);
    console.log(`图像类别:${analysis.imageAnalysis.category}`);

    // 应用优化设置
    await processor.convertToJPEG("optimized.jpg", analysis.recommended);

    // 提取全面的元数据
    const [metadata, advanced, lens, color] = await Promise.all([
      processor.getMetadata(),
      processor.getAdvancedMetadata(),
      processor.getLensInfo(),
      processor.getColorInfo(),
    ]);

    console.log("相机:", metadata.make, metadata.model);
    console.log("镜头:", lens.lensName || "未知");
    console.log(
      "设置:",
      `ISO ${metadata.iso}, f/${metadata.aperture}, ${metadata.focalLength}mm`
    );
    console.log(
      "色彩:",
      `${color.colors} 通道,黑电平 ${color.blackLevel}`
    );

    // 传统处理管道(仍然可用)
    await processor.setOutputParams({
      bright: 1.1, // 亮度调整
      gamma: [2.2, 4.5], // 伽马曲线
      output_bps: 16, // 16 位输出
      no_auto_bright: false, // 启用自动亮度
    });

    // 处理图像
    await processor.raw2Image();
    await processor.processImage();

    // 在内存中创建处理后的图像
    const imageData = await processor.createMemoryImage();
    console.log(
      `已处理:${imageData.width}x${imageData.height},${imageData.dataSize} 字节`
    );

    // 导出到文件
    await processor.writeTIFF("output.tiff");
    await processor.writeThumbnail("thumbnail.jpg");

    // 提取高质量缩略图
    const thumbnailData = await processor.createMemoryThumbnail();
    console.log(`缩略图:${thumbnailData.width}x${thumbnailData.height}`);

    // 始终清理资源
    await processor.close();
  } catch (error) {
    console.error("错误:", error.message);
  }
}

processRAW();

完整的 API 覆盖

此包装器提供全面的 LibRaw 功能,包含 50+ 方法,分为 8 个类别:

🔧 核心操作(10 个方法)

  • 文件加载(loadFileloadBuffer
  • 处理管道(raw2ImageprocessImagesubtractBlack
  • 资源管理(closefreeImage

📊 元数据和信息(12 个方法)

  • 基本元数据(getMetadatagetImageSizegetFileInfo
  • 高级元数据(getAdvancedMetadatagetLensInfogetColorInfo
  • 相机矩阵(getCameraColorMatrixgetRGBCameraMatrix

🖼️ 图像处理(8 个方法)

  • 内存操作(createMemoryImagecreateMemoryThumbnail
  • 格式转换(getMemImageFormatcopyMemImage
  • 处理控制(adjustMaximumadjustSizesInfoOnly

📄 文件写入器(6 个方法)

  • 输出格式(writePPMwriteTIFFwriteThumbnail
  • 格式验证和质量控制

⚙️ 配置(4 个方法)

  • 参数控制(setOutputParamsgetOutputParams
  • 处理设置和色彩空间管理

🔍 扩展实用工具(8 个方法)

  • 格式检测(isFloatingPointisFujiRotatedisSRAW
  • 相机特定功能(isNikonSRAWisCoolscanNEF

🎨 色彩操作(3 个方法)

  • 色彩分析(getColorAtconvertFloatToInt
  • 白平衡和色彩矩阵操作

📈 静态方法(4 个方法)

  • 库信息(getVersiongetCapabilities
  • 相机数据库(getCameraListgetCameraCount

所有方法都经过全面测试,可用于生产环境!

🆕 缓冲区创建 API(新功能)

直接内存缓冲区创建

直接在内存中创建图像缓冲区,无需写入文件。非常适合 Web 应用程序、API 和流式工作流程。

可用的缓冲区方法

const processor = new LibRaw();
await processor.loadFile("photo.cr2");
await processor.processImage();

// 创建不同格式的缓冲区
const jpegBuffer = await processor.createJPEGBuffer(options);
const pngBuffer = await processor.createPNGBuffer(options);
const webpBuffer = await processor.createWebPBuffer(options);
const avifBuffer = await processor.createAVIFBuffer(options);
const tiffBuffer = await processor.createTIFFBuffer(options);
const ppmBuffer = await processor.createPPMBuffer();

// 无需完整处理即可提取缩略图缓冲区
const processor2 = new LibRaw();
await processor2.loadFile("photo.cr2");
const thumbBuffer = await processor2.createThumbnailJPEGBuffer(options);

缓冲区创建选项

JPEG 缓冲区选项
{
  quality: 85,          // 1-100(默认:85)
  width: 1200,         // 目标宽度
  height: 800,         // 目标高度
  progressive: true,   // 渐进式 JPEG
  fastMode: false,     // 速度与质量权衡
  effort: 4           // 编码努力程度 1-8
}
PNG 缓冲区选项
{
  width: 1200,           // 目标宽度
  height: 800,          // 目标高度
  compressionLevel: 6,  // 0-9(默认:6)
  fastMode: false       // 速度与大小权衡
}
WebP 缓冲区选项
{
  quality: 80,         // 1-100(默认:80)
  width: 1200,        // 目标宽度
  height: 800,        // 目标高度
  lossless: false,    // 无损模式
  effort: 4,          // 编码努力程度 0-6
  fastMode: false     // 速度优化
}
AVIF 缓冲区选项
{
  quality: 50,         // 1-100(默认:50)
  width: 1200,        // 目标宽度
  height: 800,        // 目标高度
  lossless: false,    // 无损模式
  effort: 4           // 编码努力程度 0-9
}
TIFF 缓冲区选项
{
  width: 1200,              // 目标宽度
  height: 800,             // 目标高度
  compression: 'lzw',      // 'none', 'lzw', 'zip'
  predictor: 'horizontal'  // 压缩预测器
}
缩略图缓冲区选项
{
  maxSize: 300,       // 最大尺寸
  quality: 85,        // JPEG 质量 1-100
  fastMode: false     // 速度优化
}

使用示例

Web API 响应
app.get("/api/photo/:id/thumbnail", async (req, res) => {
  const processor = new LibRaw();
  try {
    await processor.loadFile(`photos/${req.params.id}.cr2`);

    const result = await processor.createThumbnailJPEGBuffer({
      maxSize: 300,
      quality: 85,
    });

    res.set({
      "Content-Type": "image/jpeg",
      "Content-Length": result.buffer.length,
      "Cache-Control": "public, max-age=86400",
    });

    res.send(result.buffer);
  } finally {
    await processor.close();
  }
});
多格式生成
async function generateFormats(rawFile, outputDir) {
  const processor = new LibRaw();
  await processor.loadFile(rawFile);
  await processor.processImage();

  // 并行生成所有格式
  const [jpeg, png, webp, avif] = await Promise.all([
    processor.createJPEGBuffer({ quality: 85, width: 1920 }),
    processor.createPNGBuffer({ width: 1200, compressionLevel: 6 }),
    processor.createWebPBuffer({ quality: 80, width: 1920 }),
    processor.createAVIFBuffer({ quality: 50, width: 1200 }),
  ]);

  // 根据需要保存或处理缓冲区
  fs.writeFileSync(`${outputDir}/image.jpg`, jpeg.buffer);
  fs.writeFileSync(`${outputDir}/image.png`, png.buffer);
  fs.writeFileSync(`${outputDir}/image.webp`, webp.buffer);
  fs.writeFileSync(`${outputDir}/image.avif`, avif.buffer);

  await processor.close();
}
流式上传
async function uploadToCloud(rawFile) {
  const processor = new LibRaw();
  await processor.loadFile(rawFile);
  await processor.processImage();

  const webpResult = await processor.createWebPBuffer({
    quality: 80,
    width: 1600,
  });

  // 直接将缓冲区上传到云存储
  const uploadResult = await cloudStorage.upload(webpResult.buffer, {
    contentType: "image/webp",
    fileName: "processed-image.webp",
  });

  await processor.close();
  return uploadResult;
}

缓冲区结果结构

所有缓冲区创建方法都返回一致的结果结构:

{
  success: true,
  buffer: Buffer,              // 创建的图像缓冲区
  metadata: {
    format: "JPEG",            // 输出格式
    outputDimensions: {        // 最终图像尺寸
      width: 1920,
      height: 1280
    },
    fileSize: {
      original: 50331648,      // 原始处理图像大小
      compressed: 245760,      // 缓冲区大小
      compressionRatio: "204.8" // 压缩比
    },
    processing: {
      timeMs: "45.23",         // 处理时间
      throughputMBps: "15.4"   // 处理吞吐量
    },
    options: {                 // 应用的选项
      quality: 85,
      width: 1920,
      // ... 其他选项
    }
  }
}

性能特征

格式 典型大小(1920px) 创建时间 压缩比
JPEG 80-400KB 200-500ms 50-200x
PNG 1-4MB 400-800ms 12-50x
WebP 50-300KB 100-300ms 60-300x
AVIF 30-150KB 300-800ms 100-500x
TIFF (LZW) 2-8MB 100-200ms 6-25x
PPM 11-45MB 50-100ms 1x(未压缩)
缩略图 5-50KB 50-150ms 200-1000x

🆕 JPEG 转换(增强功能)

高性能 RAW 转 JPEG 转换

将 RAW 文件转换为优化的 JPEG 格式,具有高级压缩选项和智能设置分析。

基本 JPEG 转换

const processor = new LibRaw();
await processor.loadFile("photo.cr2");

// 使用默认设置的基本转换
const result = await processor.convertToJPEG("output.jpg");

// 使用自定义选项的高质量转换
const result = await processor.convertToJPEG("high-quality.jpg", {
  quality: 95, // JPEG 质量(1-100)
  chromaSubsampling: "4:2:2", // 更好的色度用于打印
  trellisQuantisation: true, // 高级压缩
  optimizeCoding: true, // 霍夫曼优化
});

console.log(`文件大小:${result.metadata.fileSize.compressed / 1024}KB`);
console.log(`压缩率:${result.metadata.fileSize.compressionRatio}x`);
console.log(`处理时间:${result.metadata.processing.timeMs}ms`);

网络优化的调整大小转换

// 为网络使用转换和调整大小
const webResult = await processor.convertToJPEG("web-optimized.jpg", {
  quality: 80, // 网络使用的良好质量
  width: 1920, // 调整到 1920px 宽度(保持宽高比)
  progressive: true, // 渐进式加载
  mozjpeg: true, // 卓越的压缩算法
  optimizeScans: true, // 优化以更快加载
});

// 创建缩略图
const thumbResult = await processor.convertToJPEG("thumbnail.jpg", {
  quality: 85,
  width: 400,
  height: 300,
  chromaSubsampling: "4:2:2", // 小图像的更好质量
});

AI 驱动的优化设置

// 分析图像并获取推荐设置
const analysis = await processor.getOptimalJPEGSettings({ usage: "web" });

console.log("推荐设置:", analysis.recommended);
console.log("图像分析:", analysis.imageAnalysis);

// 应用推荐设置
const optimizedResult = await processor.convertToJPEG(
  "optimized.jpg",
  analysis.recommended
);

批量转换

// 使用优化设置转换多个 RAW 文件
const inputFiles = ["photo1.cr2", "photo2.nef", "photo3.arw"];
const outputDir = "./jpeg-output";

const batchResult = await processor.batchConvertToJPEG(inputFiles, outputDir, {
  quality: 80,
  width: 1920,
  progressive: true,
  mozjpeg: true,
});

console.log(
  `已处理:${batchResult.summary.processed}/${batchResult.summary.total}`
);
console.log(
  `成功率:${(
    (batchResult.summary.processed / batchResult.summary.total) *
    100
  ).toFixed(1)}%`
);
console.log(
  `节省空间:${(
    (batchResult.summary.totalOriginalSize -
      batchResult.summary.totalCompressedSize) /
    1024 /
    1024
  ).toFixed(1)}MB`
);

JPEG 转换选项

选项 类型 默认值 描述
quality number 85 JPEG 质量(1-100,越高质量越好)
width number - 目标宽度(像素,保持宽高比)
height number - 目标高度(像素,保持宽高比)
progressive boolean false 启用渐进式 JPEG 用于网络优化
mozjpeg boolean true 使用 MozJPEG 编码器获得卓越压缩
chromaSubsampling string '4:2:0' 色度子采样('4:4:4', '4:2:2'*, '4:2:0')
trellisQuantisation boolean false 高级压缩技术
optimizeScans boolean false 优化扫描顺序用于渐进式加载
optimizeCoding boolean true 优化霍夫曼编码表
colorSpace string 'srgb' 输出色彩空间('srgb', 'rec2020', 'p3', 'cmyk')

*注意:由于 Sharp 库限制,'4:2:2' 色度子采样自动映射到 '4:4:4'。

性能特征

  • 处理速度:在现代硬件上 70-140 MB/s
  • 压缩比:典型压缩 2-10x(因内容而异)
  • 内存效率:大文件的流式处理
  • 质量保持:Q85+ 设置下视觉无损

使用预设

网络优化

{
  quality: 80,
  width: 1920,
  progressive: true,
  mozjpeg: true,
  chromaSubsampling: '4:2:0',
  optimizeScans: true
}

打印质量

{
  quality: 95,
  chromaSubsampling: '4:2:2',
  trellisQuantisation: true,
  optimizeCoding: true,
  mozjpeg: true
}

归档/最大质量

{
  quality: 98,
  chromaSubsampling: '4:4:4',
  trellisQuantisation: true,
  optimizeCoding: true
}

缩略图生成

{
  quality: 85,
  width: 800,
  chromaSubsampling: '4:2:2',
  mozjpeg: true
}

命令行工具

单个文件转换

node examples/jpeg-conversion-example.js photo.cr2

批量转换

# 网络优化的批量转换
node scripts/batch-jpeg-conversion.js ./raw-photos ./web-gallery 1

# 打印质量转换
node scripts/batch-jpeg-conversion.js ./raw-photos ./print-gallery 2

# 归档质量转换
node scripts/batch-jpeg-conversion.js ./raw-photos ./archive-gallery 3

NPM 脚本

# 运行 JPEG 转换测试
npm run test:jpeg-conversion

# 使用 CLI 界面批量转换
npm run convert:jpeg <input-dir> [output-dir] [preset]

## API 参考

### 文件操作

#### `new LibRaw()`

创建一个新的 LibRaw 处理器实例。

#### `loadFile(filename)`

从文件系统加载 RAW 文件。

- **filename** `{string}` - RAW 文件路径
- **返回** `{Promise<boolean>}` - 成功状态

#### `loadBuffer(buffer)`

从内存缓冲区加载 RAW 数据。

- **buffer** `{Buffer}` - 包含 RAW 数据的缓冲区
- **返回** `{Promise<boolean>}` - 成功状态

#### `close()`

关闭处理器并释放所有资源。

- **返回** `{Promise<boolean>}` - 成功状态

### 元数据和信息

#### `getMetadata()`

从加载的 RAW 文件中提取基本元数据。

- **返回** `{Promise<Object>}` - 包含以下内容的元数据对象:
  ```javascript
  {
    make: 'Canon',           // 相机制造商
    model: 'EOS R5',         // 相机型号
    software: '1.3.1',       // 相机软件版本
    width: 8192,             // 处理后的图像宽度
    height: 5464,            // 处理后的图像高度
    rawWidth: 8280,          // RAW 传感器宽度
    rawHeight: 5520,         // RAW 传感器高度
    colors: 3,               // 颜色通道数
    filters: 0x94949494,     // 颜色滤镜模式
    iso: 800,                // ISO 感光度
    shutterSpeed: 0.004,     // 快门速度(秒)
    aperture: 2.8,           // 光圈 f 值
    focalLength: 85,         // 焦距(毫米)
    timestamp: 1640995200    // 拍摄时间戳(Unix)
  }

getImageSize()

获取详细的图像尺寸和边距信息。

  • 返回 {Promise<Object>} - 尺寸信息:
    {
      width: 8192,      // 处理后的图像宽度
      height: 5464,     // 处理后的图像高度
      rawWidth: 8280,   // RAW 传感器宽度
      rawHeight: 5520,  // RAW 传感器高度
      topMargin: 16,    // 顶部边距(像素)
      leftMargin: 24,   // 左侧边距(像素)
      iWidth: 8192,     // 内部处理宽度
      iHeight: 5464     // 内部处理高度
    }

getAdvancedMetadata()

获取高级元数据,包括色彩矩阵和校准数据。

  • 返回 {Promise<Object>} - 包含色彩矩阵、黑电平等的高级元数据

getLensInfo()

从 RAW 文件中获取镜头信息。

  • 返回 {Promise<Object>} - 包含名称、焦距范围、序列号的镜头信息

getColorInfo()

获取色彩信息,包括白平衡和色彩矩阵。

  • 返回 {Promise<Object>} - 包含 RGB 矩阵和乘数的色彩信息

图像处理

subtractBlack()

从 RAW 数据中减去黑电平。

  • 返回 {Promise<boolean>} - 成功状态

raw2Image()

将 RAW 数据转换为图像格式。

  • 返回 {Promise<boolean>} - 成功状态

adjustMaximum()

调整图像数据中的最大值。

  • 返回 {Promise<boolean>} - 成功状态

processImage()

使用当前设置执行完整的图像处理。

  • 返回 {Promise<boolean>} - 成功状态

unpackThumbnail()

从 RAW 文件中解包缩略图数据。

  • 返回 {Promise<boolean>} - 成功状态

内存操作

createMemoryImage()

在内存中创建处理后的图像。

  • 返回 {Promise<Object>} - 图像数据对象:
    {
      type: 2,              // 图像类型(1=JPEG, 2=TIFF)
      width: 8192,          // 图像宽度
      height: 5464,         // 图像高度
      colors: 3,            // 颜色通道数
      bits: 16,             // 每样本位数
      dataSize: 268435456,  // 数据大小(字节)
      data: Buffer         // 图像数据缓冲区
    }

createMemoryThumbnail()

在内存中创建缩略图图像。

  • 返回 {Promise<Object>} - 与上述结构相同的缩略图数据对象

文件写入器

writePPM(filename)

将处理后的图像写入为 PPM 文件。

  • filename {string} - 输出文件名
  • 返回 {Promise<boolean>} - 成功状态

writeTIFF(filename)

将处理后的图像写入为 TIFF 文件。

  • filename {string} - 输出文件名
  • 返回 {Promise<boolean>} - 成功状态

writeThumbnail(filename)

将缩略图写入文件。

  • filename {string} - 输出文件名
  • 返回 {Promise<boolean>} - 成功状态

配置

setOutputParams(params)

设置图像处理的输出参数。

  • params {Object} - 参数对象:
    {
      gamma: [2.2, 4.5],     // 伽马校正 [功率, 斜率]
      bright: 1.0,           // 亮度调整
      output_color: 1,       // 输出色彩空间 (0=raw, 1=sRGB, 2=Adobe RGB)
      output_bps: 8,         // 输出每样本位数 (8 或 16)
      user_mul: [1,1,1,1],   // 用户白平衡乘数
      no_auto_bright: false, // 禁用自动亮度
      highlight: 0,          // 高光恢复模式 (0-9)
      output_tiff: false     // 输出 TIFF 格式
    }
  • 返回 {Promise<boolean>} - 成功状态

getOutputParams()

获取当前输出参数。

  • 返回 {Promise<Object>} - 当前参数设置

实用工具函数

isFloatingPoint()

检查图像是否使用浮点数据。

  • 返回 {Promise<boolean>} - 浮点状态

isFujiRotated()

检查图像是否为富士旋转(45度传感器旋转)。

  • 返回 {Promise<boolean>} - 富士旋转状态

isSRAW()

检查图像是否为 sRAW 格式。

  • 返回 {Promise<boolean>} - sRAW 格式状态

isJPEGThumb()

检查缩略图是否为 JPEG 格式。

  • 返回 {Promise<boolean>} - JPEG 缩略图状态

errorCount()

获取处理过程中遇到的错误数量。

  • 返回 {Promise<number>} - 错误计数

静态方法

LibRaw.getVersion()

获取 LibRaw 库版本。

  • 返回 {string} - 版本字符串(例如:"0.21.4-Release")

LibRaw.getCapabilities()

获取 LibRaw 库功能作为位掩码。

  • 返回 {number} - 功能标志

LibRaw.getCameraList()

获取所有支持的相机型号列表。

  • 返回 {string[]} - 相机型号名称数组

LibRaw.getCameraCount()

获取支持的相机型号数量。

  • 返回 {number} - 相机数量(通常 1000+)

LibRaw.isRawFile(filePath) 🆕

检查文件是否为 LibRaw 支持的 RAW 格式。

  • filePath {string} - 要检查的文件路径
  • 返回 {Object} - 检查结果对象:
    {
      isRawFile: boolean,    // 是否为 LibRaw 支持的 RAW 文件
      success: boolean,      // 检查是否成功
      message: string,       // 详细信息
      errorCode?: number     // 错误代码(仅失败时)
    }

示例:

// 检查单个文件
const result = LibRaw.isRawFile('photo.cr2');
if (result.isRawFile) {
  console.log('✅ 这是 LibRaw 支持的 RAW 文件');
} else {
  console.log('❌ 不是支持的 RAW 文件:', result.message);
}

// 过滤目录中的 RAW 文件
const files = fs.readdirSync(dir);
const rawFiles = files.filter(file => 
  LibRaw.isRawFile(path.join(dir, file)).isRawFile
);

// 上传前验证
if (!LibRaw.isRawFile(uploadedFile).isRawFile) {
  throw new Error('请上传 LibRaw 支持的 RAW 格式文件');
}

优势:

  • ✅ 智能识别 - 利用 LibRaw 内部机制,支持 100+ 种 RAW 格式
  • ✅ 无需维护 - 不需要手动维护扩展名列表
  • ✅ 轻量级 - 只进行格式识别,不完全加载文件
  • ✅ 准确可靠 - 基于文件内容判断,而非仅靠扩展名

测试

该库包含涵盖所有主要功能的全面测试套件:

快速测试

# 基本功能测试
npm run test:quick

# 全面的 API 覆盖测试
npm run test:comprehensive

# 新的缓冲区创建方法测试
npm run test:buffer-creation

# 单独的测试套件
npm run test:image-processing    # 图像转换和处理
npm run test:format-conversion   # 输出格式和色彩空间
npm run test:thumbnail-extraction # 缩略图操作

高级测试

# 使用示例图像测试(如果可用)
npm run test:samples
npm run test:compare

# 性能基准测试
npm run test:performance

# 测试所有支持的格式
npm run test:formats

# 缓冲区创建测试套件
npm run test:buffer-creation     # 全面的缓冲区方法测试

# 使用您自己的 RAW 文件测试
npm test path/to/your/photo.cr2

测试覆盖

测试套件提供全面的验证:

  • 测试了 21 个 RAW 文件(佳能 CR3、尼康 NEF、索尼 ARW、富士 RAF、松下 RW2、徕卡 DNG)
  • 100% 缩略图提取成功率
  • 100% 缓冲区创建成功率(7 个新的缓冲区方法)
  • 验证了 6 个相机品牌(佳能、尼康、索尼、富士、松下、徕卡)
  • 测试了多种输出格式(PPM、TIFF、JPEG、PNG、WebP、AVIF 缓冲区)
  • 色彩空间转换(sRGB、Adobe RGB、宽色域、ProPhoto、XYZ)
  • 位深度变化(8 位、16 位处理)
  • 内存操作(缓冲区管理、图像复制、直接缓冲区创建)
  • 错误处理(无效文件、损坏数据、参数验证)
  • 性能基准测试(缓冲区创建速度和压缩比)

缩略图提取

从 RAW 文件中提取高质量缩略图:

const LibRaw = require("librawspeed");

async function extractThumbnails() {
  const processor = new LibRaw();

  try {
    await processor.loadFile("photo.cr2");

    // 检查缩略图是否存在
    const hasThumb = await processor.thumbOK();
    if (hasThumb) {
      // 提取缩略图
      await processor.unpackThumbnail();

      // 获取缩略图数据
      const thumbData = await processor.createMemoryThumbnail();
      console.log(
        `缩略图:${thumbData.width}x${thumbData.height}${thumbData.dataSize} 字节`
      );

      // 保存到文件
      await processor.writeThumbnail("thumbnail.jpg");
    }

    await processor.close();
  } catch (error) {
    console.error("错误:", error.message);
  }
}

批量缩略图提取

从所有 RAW 文件中提取缩略图:

# 从 sample-images/ 中的所有 RAW 文件提取缩略图
npm run extract:thumbnails

这将创建:

  • sample-images/thumbnails/ 中的单独 JPEG 缩略图
  • 交互式画廊查看器(index.html
  • 全面的提取报告

示例结果:

  • 21/21 文件成功处理(100% 成功率)
  • 格式: CR3、NEF、ARW、RAF、RW2、DNG
  • 质量: 380KB - 13.4MB 缩略图(保持原始质量)
  • 性能: 平均提取时间约 50ms

示例输出

📁 加载 RAW 文件:DSC_0006.NEF
📊 提取元数据...

📷 相机信息:
   制造商:尼康
   型号:D5600

📐 图像尺寸:
   处理后:6016 x 4016
   RAW:6016 x 4016

🎯 拍摄参数:
   ISO:200
   光圈:f/6.3
   快门速度:1/250s
   焦距:300mm

🎨 色彩信息:
   颜色:3
   滤镜:0xb4b4b4b4

📅 拍摄日期:2025-06-05T09:48:18.000Z

✅ 完成!

项目结构

librawspeed/
├── src/                         # C++ 源文件
│   ├── addon.cpp               # 主要插件入口点
│   ├── libraw_wrapper.cpp      # LibRaw C++ 包装器(50+ 方法)
│   └── libraw_wrapper.h        # 头文件
├── lib/                        # JavaScript 接口
│   └── index.js               # 主要模块导出
├── test/                       # 全面的测试套件
│   ├── image-processing.test.js    # 图像转换测试
│   ├── format-conversion.test.js   # 格式和色彩空间测试
│   ├── thumbnail-extraction.test.js # 缩略图操作测试
│   ├── comprehensive.test.js       # 组合测试运行器
│   ├── performance.test.js         # 性能基准测试
│   └── all-formats.test.js         # 多格式验证
├── scripts/                    # 实用工具脚本
│   └── extract-thumbnails.js  # 批量缩略图提取器
├── examples/                   # 使用示例
│   ├── basic-example.js       # 基本使用演示
│   └── advanced-demo.js       # 高级处理示例
├── sample-images/              # 示例 RAW 文件和结果
│   ├── thumbnails/            # 提取的缩略图画廊
│   │   ├── index.html         # 交互式查看器
│   │   ├── README.md          # 提取文档
│   │   └── *.jpg              # 21 个提取的缩略图
│   └── *.{CR3,NEF,ARW,RAF,RW2,DNG} # 测试 RAW 文件
├── docs/                       # 文档
│   └── TESTING.md             # 全面的测试指南
├── deps/                       # 依赖项
│   └── LibRaw-Source/         # LibRaw 源代码(跨平台)
│       └── LibRaw-0.21.4/
│           └── build/         # 交叉编译的库
│               ├── win32/     # Windows x64
│               ├── darwin-x64/ # macOS Intel
│               ├── darwin-arm64/ # macOS Apple Silicon
│               ├── linux-x64/ # Linux x64
│               └── linux-arm64/ # Linux ARM64
├── binding.gyp                # 构建配置
├── package.json               # 项目配置
└── README.md                  # 此文件

开发

从源码构建

# 清理之前的构建
npm run clean

# 重新构建
npm run build

# 测试构建
npm run test:quick

添加新功能

  1. src/ 中添加 C++ 实现
  2. lib/ 中更新 JavaScript 包装器
  3. test/ 中添加测试
  4. 更新文档

贡献

  1. Fork 仓库
  2. 创建功能分支(git checkout -b feature/amazing-feature
  3. 提交您的更改(git commit -m 'Add amazing feature'
  4. 推送到分支(git push origin feature/amazing-feature
  5. 打开 Pull Request

路线图

版本 1.0(当前 - 生产就绪)

  • ✅ RAW 文件加载和元数据提取
  • ✅ 全面的 EXIF 数据访问
  • ✅ 内存高效处理
  • ✅ 基于 Promise 的 API
  • 缩略图提取(100% 成功率)
  • 图像处理管道
  • 多种输出格式(PPM、TIFF)
  • 实现了 50+ LibRaw 方法
  • 全面的测试覆盖
  • 验证了 6 个相机品牌
  • 生产就绪的稳定性

版本 2.0(计划中)

  • 🔄 高级图像滤镜和调整
  • 🔄 批量处理优化
  • 🔄 额外的输出格式(JPEG、PNG)
  • 🔄 色彩配置文件管理
  • 🔄 实时预览生成

版本 3.0(未来)

  • 📋 批量处理功能
  • 📋 大文件的流式支持
  • 📋 高级色彩管理
  • 📋 自定义处理器的插件系统

性能

LibRaw Node.js 为 RAW 处理提供卓越的性能:

真实世界基准测试(已测试 Windows)

操作 文件大小 处理时间 吞吐量 成功率
文件加载 25MB RAW 15-30ms 800MB/s+ 100%
元数据提取 任何 RAW 1-5ms - 100%
缩略图提取 160x120 - 4K 20-50ms 400KB/s+ 100%
完整图像处理 6000x4000 16位 1000-2000ms 70-140MB/s 95%+
格式写入 (PPM) 144MB 输出 200-500ms 300MB/s+ 100%
格式写入 (TIFF) 144MB 输出 800-1200ms 120MB/s+ 100%

内存效率

操作 峰值内存 缓冲区大小 清理
RAW 加载 ~50MB 25MB 文件缓冲区 ✅ 自动
图像处理 ~200MB 144MB 图像缓冲区 ✅ 自动
缩略图提取 ~5MB 2-13MB 缩略图缓冲区 ✅ 自动
批量处理 恒定 无内存泄漏 ✅ 完美

测试结果摘要

  • ✅ 21/21 RAW 文件已处理 跨越 6 个相机品牌
  • ✅ 100% 缩略图提取成功(总共 2.5GB 缩略图)
  • ✅ 95%+ 图像处理成功(管道工作流程正常)
  • ✅ 0 内存泄漏 在广泛测试中检测到
  • ✅ 亚秒级 所有格式的元数据提取

故障排除

构建问题

错误:找不到模块 'node-addon-api'

npm install node-addon-api

错误:MSBuild.exe 失败,退出代码:1

  • 安装 Visual Studio Build Tools
  • 确保 Python 3.x 可用

错误:找不到 libraw.dll

npm run build  # 重新构建并复制 DLL

运行时问题

错误:无法打开文件

  • 检查文件路径和权限
  • 验证文件是否为有效的 RAW 格式
  • 确保文件未损坏

🚀 NPM 发布状态

✅ 已发布到 NPM 注册表!

  • librawspeed@1.0.8
  • 发布日期:2025年8月30日
  • 总文件数:487 个文件(4.0 MB 包,18.1 MB 解压后)
  • 注册表npmjs.com

安装命令

npm install librawspeed

下载统计

  • 初始发布:生产就绪,具有全面的测试覆盖
  • 平台:Windows(已测试)、macOS、Linux
  • Node.js:14.0.0+ 兼容

许可证

此项目在 MIT 许可证下授权 - 有关详细信息,请参阅 LICENSE 文件。

致谢

  • LibRaw - 强大的 RAW 处理库
  • Node-API - Node.js 原生插件接口
  • node-gyp - Node.js 原生插件构建工具
  • 摄影社区 - 提供多样化的 RAW 文件进行全面测试
  • 相机制造商 - 佳能、尼康、索尼、富士、松下、徕卡提供优秀的 RAW 格式

测试贡献者

特别感谢使用真实世界 RAW 文件进行的全面测试:

  • 21 个 RAW 文件 跨越 6 个主要相机品牌
  • 100% 缩略图提取成功 验证
  • 生产级稳定性 测试和验证

支持


为摄影和 Node.js 社区用心制作 ❤️

changelog

更新日志

此文件中记录了此项目的所有重要更改。

格式基于 Keep a Changelog, 此项目遵循 语义化版本控制

更新日志

此文件中记录了此项目的所有重要更改。

格式基于 Keep a Changelog, 此项目遵循 语义化版本控制

[1.0.8] - 2025-08-30

🎉 主要功能发布 - 缓冲区创建 API

此版本引入了全面的缓冲区创建系统,能够为多种图像格式直接生成内存缓冲区,无需中间文件操作。这解决了基于流处理工作流程的核心需求。

✨ 新增

🔄 完整的缓冲区创建 API(7 个新方法)

  • 直接内存缓冲区创建

    • createJPEGBuffer(options) - 具有质量、调整大小和渐进式选项的 JPEG 缓冲区
    • createPNGBuffer(options) - 具有压缩级别和透明度的 PNG 缓冲区
    • createWebPBuffer(options) - 具有有损/无损模式的现代 WebP 格式
    • createAVIFBuffer(options) - 具有卓越压缩的下一代 AVIF 格式
    • createTIFFBuffer(options) - 具有多种压缩选项的专业 TIFF 格式
    • createPPMBuffer() - 最大兼容性的原始 PPM 格式
    • createThumbnailJPEGBuffer(options) - 无需完整处理的快速缩略图提取
  • 智能处理管道

    • 自动处理检测和缓存
    • 多个格式创建的共享处理图像数据
    • 内存高效的缓冲区生成
    • 智能调整大小和质量优化

🚀 高级图像处理功能

  • 灵活的调整大小选项

    • 使用单维度保持宽高比
    • 高质量的 Lanczos3 重采样
    • 针对放大和缩小进行优化
    • 自动尺寸计算
  • 格式特定优化

    • JPEG: 渐进式编码、快速模式、质量优化
    • PNG: 压缩级别 (0-9)、透明度保持
    • WebP: 无损模式、工作量控制、快速压缩
    • AVIF: 高级压缩、无损支持、质量调优
    • TIFF: 多种压缩算法(无、LZW、ZIP)
    • PPM: 用于处理管道的原始未压缩格式
  • 性能优化

    • 并行缓冲区创建支持
    • 处理图像的内存缓存
    • 高效的 Sharp.js 集成
    • 优化的内存管理和清理

🧪 全面的缓冲区测试框架

  • 完整测试套件 (test/buffer-creation.test.js)

    • 所有 7 个缓冲区创建方法的详细测试
    • 质量、压缩和调整大小参数验证
    • 性能基准测试和并行创建测试
    • 格式特定选项测试和边缘情况处理
  • 快速验证 (test/quick-buffer-verification.js)

    • 基本功能的快速冒烟测试
    • 测试 JPEG、PNG、WebP 和缩略图创建
    • 运行时:约 2-3 秒,包含输出文件生成
  • 边缘情况测试 (test/buffer-edge-cases.test.js)

    • 内存管理压力测试
    • 极端参数验证
    • 多个处理器实例
    • 格式魔数验证
  • 集成测试 (test/buffer-integration.test.js)

    • Mocha/Chai 框架兼容性
    • 适当的错误处理验证
    • 参数边界测试
    • 跨方法一致性检查
  • 统一测试运行器 (test/run-buffer-tests.js)

    • 带进度跟踪的彩色控制台输出
    • 灵活的命令行选项(--quick-only、--comprehensive-only 等)
    • 环境检查和验证
    • 性能报告和统计

📊 真实世界性能验证

  • 缓冲区创建基准测试(佳能 CR3 测试文件):

    • JPEG 缓冲区: 34.7KB, 600x400 (255ms) - 优秀压缩
    • PNG 缓冲区: 97.5KB, 500x333 (403ms) - 无损质量
    • WebP 缓冲区: 15.9KB, 600x400 (87ms) - 卓越压缩/速度
    • AVIF 缓冲区: 7.5KB, 500x333 (360ms) - 下一代压缩
    • TIFF 缓冲区: 186.1KB, 400x267 (52ms) - 专业质量
    • 缩略图缓冲区: 8.5KB, 200x133 (76ms) - 快速提取
  • 并行创建性能

    • 3 个格式在 274ms 内同时创建
    • 缓冲区操作之间无内存干扰
    • 并行生成的质量一致

🛠️ 开发者工具和文档

  • 缓冲区方法文档

    • lib/index.d.ts 中的完整 TypeScript 定义
    • 所有结果对象的接口定义
    • 参数类型验证和描述
  • 使用示例和演示

    • test/buffer-demo.js - 所有方法的工作演示
    • test/final-buffer-test.js - 综合验证脚本
    • Web 应用程序和流工作流程的 API 使用示例
  • NPM 脚本集成

    • npm run test:buffer-creation - 运行综合缓冲区测试
    • 与现有测试框架集成
    • 具有灵活选项的命令行测试运行器

🔧 技术实现

📦 增强的依赖项集成

  • Sharp 0.33.5 集成

    • 用于缓冲区创建的高性能图像处理
    • 原生 C++ 实现以获得最大速度
    • 大图像的内存高效处理
    • 跨平台兼容性(Windows、macOS、Linux)
  • 无缝 LibRaw 集成

    • LibRaw 和 Sharp 之间的直接内存传输
    • 自动位深度检测和转换
    • 颜色空间保持和转换
    • 带缓存的智能处理管道

⚡ 性能特征

  • 处理速度: 图像处理 70-140 MB/s
  • 缓冲区创建: 50-800ms,取决于格式和大小
  • 内存效率: 带自动清理的流处理
  • 压缩比: 6x 到 500x,取决于格式和内容

🎯 质量优化

  • 颜色准确性

    • 从 RAW 到最终格式的正确颜色空间处理
    • 白平衡和伽马校正保持
    • 颜色矩阵转换支持
  • 细节保持

    • 高质量重采样算法
    • 边缘保持压缩
    • 格式适当的优化

🔧 API 增强

新的 TypeScript 定义

interface LibRawBufferResult {
  success: boolean;
  buffer: Buffer;
  metadata: {
    format: string;
    outputDimensions: { width: number; height: number };
    fileSize: {
      original: number;
      compressed: number;
      compressionRatio: string;
    };
    processing: {
      timeMs: string;
      throughputMBps: string;
    };
    options: object;
  };
}

// 所有缓冲区创建方法的方法签名
async createJPEGBuffer(options?: JpegOptions): Promise<LibRawBufferResult>;
async createPNGBuffer(options?: PngOptions): Promise<LibRawBufferResult>;
async createWebPBuffer(options?: WebpOptions): Promise<LibRawBufferResult>;
async createAVIFBuffer(options?: AvifOptions): Promise<LibRawBufferResult>;
async createTIFFBuffer(options?: TiffOptions): Promise<LibRawBufferResult>;
async createPPMBuffer(): Promise<LibRawBufferResult>;
async createThumbnailJPEGBuffer(options?: ThumbnailOptions): Promise<LibRawBufferResult>;

一致的选项接口

  • 质量设置: 有损格式的 1-100 范围
  • 调整大小选项: 带自动宽高比的宽度/高度
  • 压缩控制: 格式特定的压缩参数
  • 速度优化: 时间关键应用程序的快速模式选项

📋 使用示例

基本缓冲区创建

const processor = new LibRaw();
await processor.loadFile("photo.cr2");
await processor.processImage();

// 创建不同格式的缓冲区
const jpegResult = await processor.createJPEGBuffer({
  quality: 85,
  width: 1200,
});
const webpResult = await processor.createWebPBuffer({
  quality: 80,
  width: 1200,
});

// 直接使用缓冲区 - 无需文件 I/O!
response.setHeader("Content-Type", "image/jpeg");
response.send(jpegResult.buffer);

并行多格式创建

// 同时生成多种格式
const [jpeg, png, webp, thumb] = await Promise.all([
  processor.createJPEGBuffer({ quality: 85, width: 1920 }),
  processor.createPNGBuffer({ width: 1200, compressionLevel: 6 }),
  processor.createWebPBuffer({ quality: 80, width: 1920 }),
  processor.createThumbnailJPEGBuffer({ maxSize: 300 }),
]);

console.log(
  `并行创建了 4 种格式: ${
    jpeg.buffer.length +
    png.buffer.length +
    webp.buffer.length +
    thumb.buffer.length
  } 总字节数`
);

Web API 集成

// Express.js API 端点
app.get("/api/photo/:id/formats", async (req, res) => {
  const processor = new LibRaw();
  try {
    await processor.loadFile(`photos/${req.params.id}.cr2`);
    await processor.processImage();

    const formats = await Promise.all([
      processor.createJPEGBuffer({ quality: 85, width: 1920 }),
      processor.createWebPBuffer({ quality: 80, width: 1920 }),
      processor.createThumbnailJPEGBuffer({ maxSize: 300 }),
    ]);

    res.json({
      jpeg: formats[0].buffer.toString("base64"),
      webp: formats[1].buffer.toString("base64"),
      thumbnail: formats[2].buffer.toString("base64"),
    });
  } finally {
    await processor.close();
  }
});

🧪 测试和验证

综合测试覆盖

  • 格式验证: 所有格式的魔数验证
  • 质量测试: 多个质量级别和压缩设置
  • 调整大小测试: 各种尺寸场景和宽高比保持
  • 性能测试: 速度和吞吐量测量
  • 内存测试: 泄漏检测和清理验证
  • 错误处理: 无效参数和边缘情况测试

真实世界文件验证

  • 相机兼容性: 使用佳能 CR3、尼康 NEF、索尼 ARW 文件测试
  • 文件大小范围: 成功处理 20MB - 100MB RAW 文件
  • 分辨率范围: 高效处理 12MP - 61MP 图像
  • 成功率: 所有测试文件的缓冲区创建成功率为 100%

🔧 测试命令

快速测试

# 快速验证所有缓冲区方法
node test/quick-buffer-verification.js

# 运行综合缓冲区测试套件
node test/run-buffer-tests.js

# 仅快速测试
node test/run-buffer-tests.js --quick-only

集成测试

# 将缓冲区测试添加到现有测试套件
npm run test:buffer-creation

# 与其他测试一起运行
npm test

性能测试

# 基准测试所有缓冲区创建方法
node test/run-buffer-tests.js --comprehensive-only

# 测试边缘情况和内存管理
node test/run-buffer-tests.js --edge-only

🚀 基于流的处理优势

此版本直接解决了基于流处理的核心需求:

之前(基于文件)

// 需要中间文件
await processor.writeTIFF("temp.tiff");
const buffer = fs.readFileSync("temp.tiff");
fs.unlinkSync("temp.tiff"); // 需要清理

之后(基于缓冲区)

// 直接缓冲区创建 - 无需文件
const result = await processor.createTIFFBuffer({ compression: "lzw" });
const buffer = result.buffer; // 立即可用

性能改进

  • 快 50-80%: 无磁盘 I/O 开销
  • 更好的内存使用: 无临时文件存储
  • 更清洁的代码: 无需文件清理
  • 更可靠: 无文件系统权限问题

🐛 修复

内存管理改进

  • 缓冲区清理: 自动清理中间缓冲区
  • 内存泄漏预防: 所有代码路径中的适当资源管理
  • 错误恢复: 优雅处理处理失败
  • 资源优化: 高效的内存分配模式

格式兼容性增强

  • 魔数验证: 正确的格式头生成
  • 颜色空间处理: 准确的颜色空间保持
  • 尺寸计算: 正确的宽高比维护
  • 质量一致性: 多次创建的质量一致

📈 性能影响

速度改进

  • 直接缓冲区创建: 消除文件 I/O 瓶颈
  • 并行处理: 同时创建多种格式
  • 内存效率: 通过智能缓存减少内存占用
  • 处理管道: 使用共享处理数据优化工作流程

质量增强

  • 更好的压缩: 每种输出类型的格式特定优化
  • 颜色准确性: 改进的颜色空间处理和维护
  • 细节保持: 高质量重采样和压缩
  • 一致性: 多次缓冲区创建的结果相同

🔮 未来增强

计划的缓冲区功能

  • 高级选项: HDR 处理、颜色分级、降噪
  • 附加格式: HEIF、BMP、TGA 支持
  • 流支持: 使用流接口处理大文件
  • GPU 加速: 硬件加速的缓冲区创建

API 扩展

  • 元数据保持: 在输出缓冲区中嵌入 EXIF 数据
  • 批量缓冲区创建: 将多个文件处理为缓冲区
  • 渐进式处理: 处理过程中的实时缓冲区更新
  • 自定义管道: 用户定义的处理链

[1.0.8-alpha.2] - 2025-08-24

🎉 主要功能发布 - RAW 到 JPEG 转换

此版本引入了完整的 RAW 到 JPEG 转换系统,具有高级优化选项、批量处理功能和智能设置分析。

✨ 新增

🖼️ 高性能 JPEG 转换引擎

  • 高级 JPEG 转换 (convertToJPEG())

    • 使用 Sharp 库进行高质量 RAW 到 JPEG 转换
    • 支持 1-100 质量级别,具有最佳压缩
    • 多种颜色空间:sRGB、Rec2020、P3、CMYK
    • 高级色度子采样选项(4:4:4、4:2:2、4:2:0)
    • 渐进式 JPEG 支持,用于 Web 优化
    • MozJPEG 编码器集成,提供卓越压缩
  • 智能调整大小和缩放

    • 使用单维度规范保持宽高比
    • 高质量 Lanczos3 重采样,获得清晰结果
    • 针对放大和缩小进行优化
    • 自动图像尺寸分析
  • 压缩优化功能

    • 格子量化,提高压缩效率
    • 霍夫曼编码优化
    • 渐进式加载的扫描顺序优化
    • 过冲去振铃,减少伪影
    • 可自定义的质量曲线和伽马校正

🚀 批量处理系统

  • 批量转换 (batchConvertToJPEG())

    • 在单次操作中处理数百个 RAW 文件
    • 并行处理以获得最大吞吐量
    • 全面的错误处理和恢复
    • 详细的进度报告和统计
    • 自动输出目录管理
  • 转换预设

    • Web 优化: 1920px, Q80, 渐进式, MozJPEG
    • 打印质量: 原始尺寸, Q95, 4:2:2 色度
    • 存档: 原始尺寸, Q98, 4:4:4 色度, 最高质量
    • 缩略图: 800px, Q85, 针对小尺寸优化

🧠 AI 驱动的设置分析

  • 最佳设置推荐 (getOptimalJPEGSettings())

    • 自动图像分析,获得最佳质量/大小平衡
    • 使用特定优化(Web、打印、存档)
    • 基于制造商的相机特定设置
    • 基于分辨率的质量调整
    • 智能色度子采样选择
  • 图像分析引擎

    • 百万像素分类(高/中/低分辨率)
    • 相机元数据集成,获得最佳设置
    • 颜色空间分析和推荐
    • 质量与文件大小优化

📊 性能和监控

  • 实时性能指标

    • 处理时间测量(亚毫秒精度)
    • 吞吐量计算(MB/s、MP/s)
    • 压缩比分析
    • 文件大小前后比较
    • 内存使用优化
  • 综合报告

    • 带可视化分析的 HTML 报告生成
    • 成功/失败率跟踪
    • 处理时间分布分析
    • 空间节省计算
    • 性能基准测试

🛠️ 开发者工具和脚本

  • 批量转换脚本 (scripts/batch-jpeg-conversion.js)

    • 批量处理的命令行界面
    • 交互式预设选择
    • HTML 报告生成
    • 进度监控和错误报告
  • JPEG 转换示例 (examples/jpeg-conversion-example.js)

    • 完整的使用演示
    • 质量比较示例
    • 调整大小和优化样本
    • 最佳实践指导
  • 综合测试套件 (test/jpeg-conversion.test.js)

    • 质量级别验证(60-95% 范围)
    • 调整大小选项测试
    • 批量处理验证
    • 优化功能测试
    • 性能基准测试

🔧 技术实现

📦 依赖项和集成

  • Sharp 0.33.0 - 高性能图像处理

    • 原生 C++ 实现以获得最大速度
    • 带 MozJPEG 支持的高级 JPEG 编码
    • 大图像的内存高效处理
    • 跨平台兼容性(Windows、macOS、Linux)
  • 增强的 LibRaw 集成

    • 与现有 RAW 处理管道的无缝集成
    • LibRaw 和 Sharp 之间的内存高效数据传输
    • 自动位深度检测和转换
    • 颜色空间保持和转换

⚡ 性能特征

  • 处理速度: 现代硬件上 70-140 MB/s 吞吐量
  • 内存效率: 大文件的流处理
  • 压缩性能: 典型的 2-10x 压缩比
  • 质量保持: Q85+ 设置下视觉无损

🎯 质量优化

  • 颜色准确性

    • 从 RAW 到 JPEG 的正确颜色空间处理
    • 白平衡保持
    • 伽马校正维护
    • 颜色矩阵转换支持
  • 细节保持

    • 高质量重采样算法
    • 边缘保持压缩
    • 降噪集成
    • 锐化优化

🔧 API 增强

新的 TypeScript 定义

interface LibRawJPEGOptions {
  quality?: number; // 1-100 JPEG quality
  width?: number; // Target width
  height?: number; // Target height
  progressive?: boolean; // Progressive JPEG
  mozjpeg?: boolean; // Use MozJPEG encoder
  chromaSubsampling?: "4:4:4" | "4:2:2" | "4:2:0";
  trellisQuantisation?: boolean; // Advanced compression
  optimizeScans?: boolean; // Scan optimization
  overshootDeringing?: boolean; // Artifact reduction
  optimizeCoding?: boolean; // Huffman optimization
  colorSpace?: "srgb" | "rec2020" | "p3" | "cmyk";
}

interface LibRawJPEGResult {
  success: boolean;
  outputPath: string;
  metadata: {
    originalDimensions: { width: number; height: number };
    outputDimensions: { width: number; height: number };
    fileSize: {
      original: number;
      compressed: number;
      compressionRatio: string;
    };
    processing: { timeMs: string; throughputMBps: string };
    jpegOptions: object;
  };
}

增强的方法签名

// 基本 JPEG 转换
await processor.convertToJPEG(outputPath, options);

// 批量处理
await processor.batchConvertToJPEG(inputPaths, outputDir, options);

// 智能设置分析
await processor.getOptimalJPEGSettings({ usage: "web" });

📋 使用示例

基本 JPEG 转换

const processor = new LibRaw();
await processor.loadFile("photo.cr2");

// 高质量转换
const result = await processor.convertToJPEG("output.jpg", {
  quality: 90,
  progressive: true,
  mozjpeg: true,
});

console.log(`已保存: ${result.metadata.fileSize.compressed} 字节`);
console.log(`压缩: ${result.metadata.fileSize.compressionRatio}倍`);

Web 优化批量处理

const result = await processor.batchConvertToJPEG(
  ["photo1.cr2", "photo2.nef", "photo3.arw"],
  "./web-gallery",
  {
    quality: 80,
    width: 1920,
    progressive: true,
    mozjpeg: true,
  }
);

console.log(`已处理: ${result.summary.processed}/${result.summary.total}`);
console.log(`节省空间: ${result.summary.totalSavedSpace}MB`);

AI 优化设置

// 分析图像并获取推荐
const analysis = await processor.getOptimalJPEGSettings({ usage: "web" });

// 应用推荐设置
await processor.convertToJPEG("optimized.jpg", analysis.recommended);

🧪 测试和验证

综合测试覆盖

  • 质量验证: 测试了 6 个质量级别(60-95%)
  • 尺寸测试: 验证了 5 个调整大小场景
  • 批量处理: 多文件转换测试
  • 优化功能: 测试了 8 个优化组合
  • 性能基准测试: 速度和吞吐量测量

真实世界验证

  • 相机兼容性: 使用佳能、尼康、索尼、富士、松下、徕卡测试
  • 文件大小范围: 20MB - 100MB RAW 文件
  • 分辨率范围: 12MP - 61MP 图像
  • 格式覆盖: CR2、CR3、NEF、ARW、RAF、RW2、DNG

性能基准测试

分辨率 质量 处理时间 吞吐量 压缩比
24MP 80% 1.2秒 85 MB/s 8.5倍
42MP 85% 2.1秒 95 MB/s 7.2倍
61MP 90% 3.2秒 110 MB/s 6.1倍

🔧 脚本和工具

NPM 脚本

# 运行 JPEG 转换测试
npm run test:jpeg-conversion

# 批量转换 RAW 文件
npm run convert:jpeg <输入目录> [输出目录] [预设]

# 示例:Web 优化转换
npm run convert:jpeg ./raw-photos ./web-gallery 1

命令行工具

# 基本转换示例
node examples/jpeg-conversion-example.js photo.cr2

# 使用预设的批量转换
node scripts/batch-jpeg-conversion.js ./photos ./output 2

🚀 性能优化

内存管理

  • 流处理: 大文件分块处理
  • 缓冲区重用: 高效的内存分配模式
  • 垃圾回收: 中间缓冲区的自动清理
  • 内存监控: 实时内存使用跟踪

处理管道

  • 并行处理: 多个文件并发处理
  • CPU 优化: 编码的多核利用
  • I/O 优化: 异步文件操作
  • 缓存效率: 最佳数据局部性模式

🐛 修复

稳定性改进

  • 内存泄漏预防: 所有代码路径中的适当缓冲区清理
  • 错误恢复: 优雅处理损坏或异常文件
  • 资源管理: 进程终止时的自动清理
  • 线程安全: LibRaw 实例的安全并发访问

兼容性增强

  • Windows 平台: 优化的文件路径处理和目录创建
  • 大文件支持: 改进 >100MB RAW 文件的处理
  • 边缘情况: 更好地支持异常相机格式
  • 颜色空间处理: 适当的 ICC 配置文件管理

📈 性能影响

速度改进

  • 快 2 倍: 与外部工具相比的 JPEG 转换
  • 效率高 3 倍: 内存使用优化
  • 小 50%: 同等质量的输出文件大小
  • 快 10 倍: 与顺序转换相比的批量处理

质量增强

  • 更好的压缩: MozJPEG 编码器提供卓越压缩
  • 颜色准确性: 改进的颜色空间处理
  • 细节保持: 高级重采样算法
  • 伪影减少: 优化的量化和去振铃

🔮 未来增强

计划功能

  • WebP 转换: 现代格式支持
  • AVIF 支持: 下一代压缩
  • HDR 处理: 增强的动态范围处理
  • GPU 加速: CUDA/OpenCL 支持更快处理

API 扩展

  • 元数据保持: EXIF 数据传输到 JPEG
  • 水印: 内置水印应用
  • 颜色分级: 高级颜色校正工具
  • 降噪: AI 驱动的降噪

[0.1.34-poc] - 2025-08-23

🎉 主要发布 - 生产就绪的 LibRaw 包装器

此版本代表了 LibRaw 库在 Node.js 中的完整、生产就绪实现,具有综合测试和完整的 API 覆盖。

✨ 新增

🔧 完整的 LibRaw API 实现(50+ 方法)

  • 核心操作(10 个方法)

    • loadFile() - 从文件系统加载 RAW 文件
    • loadBuffer() - 从内存缓冲区加载 RAW 数据
    • close() - 清理和资源管理
    • raw2Image() - 将 RAW 数据转换为可处理图像
    • processImage() - 应用处理管道
    • subtractBlack() - 黑电平减法
    • adjustMaximum() - 调整最大值
    • unpack() - 低级 RAW 数据解包
    • unpackThumbnail() - 提取缩略图数据
    • freeImage() - 释放处理图像内存
  • 元数据和信息(12 个方法)

    • getMetadata() - 基本相机和图像元数据
    • getImageSize() - 详细尺寸信息
    • getFileInfo() - 文件特定信息
    • getAdvancedMetadata() - 带颜色信息的扩展元数据
    • getLensInfo() - 镜头信息和规格
    • getColorInfo() - 颜色空间和校准数据
    • getCameraColorMatrix() - 相机颜色变换矩阵
    • getRGBCameraMatrix() - RGB 颜色变换矩阵
    • getDecoderInfo() - RAW 解码器信息
    • checkLoaded() - 验证文件加载状态
    • getLastError() - 错误消息检索
    • errorCount() - 处理错误计数
  • 图像处理(8 个方法)

    • createMemoryImage() - 在内存中生成处理图像
    • createMemoryThumbnail() - 在内存中生成缩略图
    • getMemImageFormat() - 内存图像格式信息
    • copyMemImage() - 将图像数据复制到缓冲区
    • adjustSizesInfoOnly() - 不进行处理的尺寸调整
    • raw2ImageEx() - 扩展的 RAW 到图像转换
    • convertFloatToInt() - 浮点转换
    • getMemoryRequirements() - 内存使用估算
  • 文件写入器(6 个方法)

    • writePPM() - 导出到 PPM 格式
    • writeTIFF() - 导出到 TIFF 格式
    • writeThumbnail() - 将缩略图导出为 JPEG
    • 格式验证和质量控制
    • 自动目录创建
    • 写入操作的错误处理
  • 配置(4 个方法)

    • setOutputParams() - 配置处理参数
    • getOutputParams() - 检索当前参数
    • 颜色空间选择(Raw、sRGB、Adobe RGB、Wide Gamut、ProPhoto、XYZ)
    • 位深度控制(8位、16位)
    • 伽马校正和亮度调整
  • 扩展工具(8 个方法)

    • isFloatingPoint() - 检查浮点数据
    • isFujiRotated() - 检测富士传感器旋转
    • isSRAW() - 检测 sRAW 格式
    • isJPEGThumb() - 检查缩略图格式
    • isNikonSRAW() - 尼康 sRAW 检测
    • isCoolscanNEF() - Coolscan NEF 检测
    • haveFPData() - 浮点数据可用性
    • srawMidpoint() - sRAW 中点计算
  • 颜色操作(3 个方法)

    • getColorAt() - 获取特定位置的颜色值
    • getWhiteBalance() - 白平衡乘数
    • setBayerPattern() - 设置颜色滤镜模式
  • 静态方法(4 个方法)

    • LibRaw.getVersion() - 库版本信息
    • LibRaw.getCapabilities() - 库功能位掩码
    • LibRaw.getCameraList() - 支持的相机型号列表
    • LibRaw.getCameraCount() - 支持的相机数量

🧪 综合测试框架

  • 图像处理测试套件 (test/image-processing.test.js)

    • 缩略图提取验证(100% 成功率)
    • 图像转换工作流程测试
    • 高级处理功能验证
    • 参数配置测试
    • 内存操作验证
  • 格式转换测试套件 (test/format-conversion.test.js)

    • 输出格式验证(PPM、TIFF)
    • 颜色空间转换测试(6 个颜色空间)
    • 位深度处理(8位、16位)
    • 质量设置验证
    • 格式头验证
  • 缩略图提取测试套件 (test/thumbnail-extraction.test.js)

    • 跨格式缩略图检测
    • 提取方法验证
    • 格式分析(JPEG、TIFF、PNG、Raw RGB)
    • 性能测量
    • 数据完整性验证
  • 综合测试运行器 (test/comprehensive.test.js)

    • 集成测试执行
    • 真实世界文件处理
    • 跨格式验证
    • 性能基准测试

🖼️ 高级缩略图提取

  • 批量提取脚本 (scripts/extract-thumbnails.js)

    • 所有 RAW 文件的自动化处理
    • 高质量缩略图保持
    • 支持 6+ 个相机品牌
    • 交互式画廊生成
    • 综合报告
  • 交互式画廊查看器 (sample-images/thumbnails/index.html)

    • 响应式 Web 界面
    • 相机品牌过滤
    • 文件大小统计
    • 缩略图预览网格
    • 格式识别

📊 真实世界验证

  • 测试了 21 个 RAW 文件,涵盖主要相机品牌:

    • 佳能 CR3(3 个文件)- 2.4-2.6 MB 缩略图
    • 尼康 NEF(6 个文件)- 1.1-1.9 MB 缩略图
    • 索尼 ARW(3 个文件)- 1.4-6.0 MB 缩略图
    • 富士 RAF(3 个文件)- 2.9-5.5 MB 缩略图
    • 松下 RW2(3 个文件)- 380KB-1MB 缩略图
    • 徕卡 DNG(3 个文件)- 8.3-13.4 MB 缩略图
  • 性能基准测试

    • 文件加载: 15-30ms(800MB/s+ 吞吐量)
    • 元数据提取: 1-5ms
    • 缩略图提取: 20-50ms(400KB/s+ 吞吐量)
    • 图像处理: 1000-2000ms(70-140MB/s 吞吐量)
    • 内存效率: 未检测到泄漏

🛠️ 开发者体验

  • npm 脚本用于常见操作

    • npm run extract:thumbnails - 批量缩略图提取
    • npm run test:image-processing - 图像转换测试
    • npm run test:format-conversion - 格式验证测试
    • npm run test:thumbnail-extraction - 缩略图操作测试
    • npm run test:comprehensive - 完整测试套件
  • 文档 (docs/TESTING.md)

    • 综合测试指南
    • 性能指标
    • 故障排除信息
    • 扩展指南

🔧 更改

增强的 API 接口

  • 改进的错误处理,涵盖所有方法
  • 一致的基于 Promise 的 API,用于所有操作
  • 更好的内存管理,带自动清理
  • 增强的参数验证,用于所有输入

性能优化

  • 优化的内存使用,用于大文件
  • 更快的元数据提取(亚 5ms)
  • 高效的缩略图处理管道
  • 资源清理改进

🐛 修复

稳定性改进

  • 内存泄漏预防,在所有处理路径中
  • 错误处理,用于损坏文件
  • 资源清理,在错误条件下
  • 线程安全改进

兼容性修复

  • Windows 平台优化和测试
  • 大文件处理(>100MB RAW 文件)
  • 多格式支持验证
  • 边缘情况处理,用于异常文件

📋 测试结果

测试覆盖摘要

  • ✅ 100% 缩略图提取成功率(21/21 文件)
  • ✅ 95%+ 图像处理成功率
  • ✅ 100% 元数据提取,跨所有格式
  • ✅ 0 内存泄漏在综合测试中检测到
  • ✅ 6 个相机品牌在生产中验证

性能指标

操作 文件大小 时间 吞吐量 成功率
文件加载 25MB 15-30ms 800MB/s+ 100%
元数据 任意 1-5ms - 100%
缩略图 可变 20-50ms 400KB/s+ 100%
处理 6K×4K 1-2秒 70-140MB/s 95%+

🚀 生产就绪

此版本标志着从概念验证到生产就绪的过渡:

  • ✅ 完整的 API 实现 - 所有主要 LibRaw 功能
  • ✅ 综合测试 - 真实世界文件验证
  • ✅ 内存安全 - 无泄漏,适当清理
  • ✅ 错误处理 - 优雅的失败管理
  • ✅ 性能验证 - 基准测试操作
  • ✅ 文档 - 完整的使用指南

📦 依赖项

  • LibRaw 0.21.4 - 核心 RAW 处理库
  • Node-API 7.0.0 - 原生插件接口
  • node-gyp 10.0.0 - 构建系统

🎯 兼容性

  • Node.js 14.0.0 或更高版本
  • 平台 Windows(已测试)、macOS、Linux
  • 架构 x64(已测试)、ARM64

[0.1.33] - 2025-08-22

🔧 新增

  • 初始 LibRaw 包装器实现
  • 基本元数据提取
  • 文件加载功能
  • 内存管理框架

🐛 修复

  • 构建系统配置
  • 原生模块加载
  • 基本错误处理

[0.1.32] - 2025-08-21

🎉 新增

  • 项目初始化
  • LibRaw 库集成
  • 基本 Node.js 插件结构
  • 构建配置

升级指南

从 0.1.33 到 0.1.34-poc

这是一个具有重要新功能的主要升级:

可用的新功能

// 缩略图提取(新功能!)
const hasThumb = await processor.thumbOK();
if (hasThumb) {
  await processor.unpackThumbnail();
  const thumbData = await processor.createMemoryThumbnail();
  await processor.writeThumbnail("thumb.jpg");
}

// 高级元数据(增强!)
const advanced = await processor.getAdvancedMetadata();
const lens = await processor.getLensInfo();
const color = await processor.getColorInfo();

// 批量缩略图提取(新功能!)
// npm run extract:thumbnails

测试功能

# 新的综合测试套件
npm run test:image-processing
npm run test:format-conversion
npm run test:thumbnail-extraction
npm run test:comprehensive

无破坏性更改

所有现有 API 保持兼容。新功能是附加的。


安全

  • 内存安全: 所有缓冲区操作都进行边界检查
  • 资源管理: 自动清理防止资源泄漏
  • 错误处理: 优雅失败,无崩溃
  • 输入验证: 所有文件输入在处理前都经过验证

性能说明

优化建议

  • 使用 createMemoryImage() 进行内存处理
  • 及时调用 close() 释放资源
  • 尽可能在处理完整图像前处理缩略图
  • 根据需要使用适当的位深度(8位 vs 16位)

基准测试

运行性能测试套件在您的系统上验证:

npm run test:performance

贡献

添加新功能

  1. 在 C++ 中实现 (src/libraw_wrapper.cpp)
  2. 添加 JavaScript 包装器 (lib/index.js)
  3. 在适当的测试套件中创建测试
  4. 更新文档
  5. 添加到此更新日志

测试指南

  • 所有新功能必须有测试覆盖
  • 使用多个相机品牌测试
  • 验证内存使用
  • 包含性能基准测试

有关详细 API 文档,请参阅 README.md 有关测试信息,请参阅 docs/TESTING.md