UNPKG

librawspeed

Version:

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

407 lines (294 loc) 9.79 kB
# LibRaw Node.js 示例 此目录包含全面的示例,演示 LibRaw Node.js 包装器的完整功能,包括传统的基于文件的操作和现代的基于缓冲区的流式操作。 ## 示例概述 ### 📚 基本示例(`basic-example.js`) **目的**:LibRaw 使用的简单介绍 ```bash node basic-example.js sample.cr2 ``` **功能**- 加载 RAW 文件 - 提取基本元数据 - 获取图像尺寸 - 基本错误处理 ### 🔬 高级功能(`advanced-features.js`) **目的**:演示特定的 LibRaw 功能 ```bash node advanced-features.js sample.cr2 ``` **功能**- 全面的元数据提取 - 镜头信息 - 色彩信息和矩阵 - 图像分析函数 - 处理配置 ### 🎯 完整示例(`complete-example.js`) **目的**:完整的处理管道演示 ```bash node complete-example.js sample.cr2 ./output ``` **功能**- 完整的 10 步处理管道 - 所有元数据类型(基本、高级、镜头、色彩) - 使用自定义参数的图像处理 - 内存操作(图像和缩略图) - 多种输出格式(PPM、TIFF、缩略图) - 缓冲区处理示例 - 性能指标 - 全面的错误处理 ### 📦 批量处理(`batch-example.js`) **目的**:高效处理多个文件 ```bash node batch-example.js ./input-folder ./output-folder --formats tiff,thumbnail --concurrency 3 ``` **功能**- 具有并发控制的多文件处理 - 进度跟踪和统计 - 可配置的输出格式 - 每个文件的错误处理 - 性能指标和吞吐量分析 - 相机和处理摘要 ### 🚀 **新功能**:流/缓冲区操作(`stream-buffer-example.js`) **目的**:用于 Web 服务和云应用程序的现代基于缓冲区的 API ```bash node stream-buffer-example.js sample.cr2 ./buffer-output ``` **功能**- 直接在内存中创建图像缓冲区(无文件 I/O) - 多种格式支持:JPEG、PNG、WebP、AVIF、TIFF、PPM - 非常适合 Web API 和云存储 - 性能优化的处理 - HTTP 响应、云上传的实用使用示例 - 格式效率比较 ### 📸 **新功能**:简单缓冲区 API(`simple-buffer-example.js`) **目的**:最常见缓冲区操作的快速开始指南 ```bash node simple-buffer-example.js sample.cr2 ``` **功能**- 网络优化的 JPEG 缓冲区创建 - 内存中的缩略图生成 - 高质量图像缓冲区 - Web 开发的实用代码示例 - 性能优势演示 ### 🔄 **新功能**:API 比较(`api-comparison-example.js`) **目的**:基于文件与基于缓冲区方法的并排比较 ```bash node api-comparison-example.js sample.cr2 ./comparison-output ``` **功能**- 文件 API 和缓冲区 API 之间的性能比较 - 用例推荐 - 格式效率分析 - 不同场景的代码示例 - 每种方法的最佳实践 ## 缓冲区/流 API 亮点 新的基于缓冲区的 API 为现代应用程序提供了几个优势: ### 🌐 Web 服务集成 ```javascript // Express.js 端点 app.get("/convert/:id", async (req, res) => { const processor = new LibRaw(); await processor.loadFile(`photos/${req.params.id}.raw`); const result = await processor.createJPEGBuffer({ quality: 85, width: 1920 }); res.set("Content-Type", "image/jpeg"); res.send(result.buffer); }); ``` ### ☁️ 云存储上传 ```javascript // 直接上传到云存储 const result = await processor.createJPEGBuffer({ quality: 90 }); await bucket.file("processed.jpg").save(result.buffer, { metadata: { contentType: "image/jpeg" }, }); ``` ### 🔄 多格式生成 ```javascript // 并行创建多种格式 const [jpeg, webp, avif] = await Promise.all([ processor.createJPEGBuffer({ quality: 85 }), processor.createWebPBuffer({ quality: 80 }), processor.createAVIFBuffer({ quality: 50 }), ]); ``` ### 🚀 可用的缓冲区方法 - `createJPEGBuffer(options)` - 具有质量、调整大小、渐进式选项的 JPEG - `createPNGBuffer(options)` - 具有压缩控制的无损 PNG - `createWebPBuffer(options)` - 现代 WebP 格式(比 JPEG 更小) - `createAVIFBuffer(options)` - 下一代 AVIF 格式(文件大小最小) - `createTIFFBuffer(options)` - 具有各种压缩选项的高质量 TIFF - `createPPMBuffer()` - 用于进一步处理的原始 PPM 格式 - `createThumbnailJPEGBuffer(options)` - 优化的缩略图生成 ## 快速开始 1. **安装依赖**(如果尚未完成): ```bash npm install ``` 2. **运行基础示例**```bash node examples/basic-example.js path/to/your/image.cr2 ``` 3. **尝试缓冲区 API(推荐用于 Web 应用)**```bash node examples/simple-buffer-example.js path/to/your/image.cr2 ``` 4. **比较 API**```bash node examples/api-comparison-example.js path/to/your/image.cr2 ``` 5. **处理多个文件**```bash node examples/batch-example.js ./raw-photos ./processed-output ``` ## 支持的文件格式 示例适用于 LibRaw 支持的所有 RAW 格式,包括: - **佳能**: `.cr2`, `.cr3`, `.crw` - **尼康**: `.nef`, `.nrw` - **索尼**: `.arw`, `.srf`, `.sr2` - **富士**: `.raf` - **奥林巴斯**: `.orf` - **松下**: `.raw`, `.rw2` - **Adobe**: `.dng` - **柯达**: `.dcr`, `.kdc` - **以及更多**(支持 1000+ 相机型号) ## 示例输出 ### 缓冲区 API 示例 ```` 📸 简单缓冲区 API 示例 ============================ 📁 处理中: sample.cr2 🔄 加载 RAW 文件... ⚙️ 处理图像... 📸 创建网络优化的 JPEG 缓冲区... ✅ Web JPEG 已创建: 1,234,567 字节 尺寸: 1920x1280 压缩: 15.2:1 🔍 创建缩略图缓冲区... ✅ 缩略图已创建: 45,123 字节 尺寸: 300x200 🎨 创建高质量缓冲区... ✅ 高质量 JPEG 已创建: 8,765,432 字节 尺寸: 8192x5464 💡 实用使用示例: 1️⃣ 保存缓冲区到文件: ```javascript fs.writeFileSync("output.jpg", webJpeg.buffer); ```` 2️⃣ 通过 HTTP 响应发送: ```javascript app.get("/image", async (req, res) => { const result = await processor.createJPEGBuffer({ quality: 85 }); res.set("Content-Type", "image/jpeg"); res.send(result.buffer); }); ``` ⚡ 性能优势: • 无文件系统 I/O - 更快处理 • 直接内存操作 • 完美适用于无服务器/云函数 • 减少磁盘空间使用 • 更好的并发处理 ✅ 完成!您的图像已准备好在内存中使用。 ``` ### 格式效率比较 ``` # 🎨 格式效率比较 📊 按文件大小排序的格式(从小到大): 🏆 AVIF: 0.89 MB 🥈 WebP: 1.23 MB 🥉 JPEG: 1.85 MB 📊 PNG: 12.4 MB 📊 TIFF: 45.2 MB ```` ## 高级配置 ### 缓冲区创建选项 ```javascript // 具有调整大小和质量控制的 JPEG const jpegResult = await processor.createJPEGBuffer({ quality: 85, // 1-100 width: 1920, // 调整到宽度 progressive: true, // 渐进式加载 colorSpace: 'srgb' // 色彩空间 }); // 具有无损选项的 WebP const webpResult = await processor.createWebPBuffer({ quality: 80, // 1-100 lossless: false, // 有损压缩 effort: 4 // 编码努力程度 0-6 }); // 最大压缩的 AVIF const avifResult = await processor.createAVIFBuffer({ quality: 50, // 较低质量以获得更小文件 effort: 6 // 最大努力以获得最佳压缩 }); ```` ### 性能优化 ```javascript // 实时处理的快速模式 const fastResult = await processor.createJPEGBuffer({ quality: 80, fastMode: true, // 优化速度而非质量 effort: 1, // 最小编码努力 }); // 归档的高质量模式 const archiveResult = await processor.createTIFFBuffer({ compression: "lzw", // 无损压缩 pyramid: true, // 多分辨率 TIFF }); ``` ## 何时使用哪种 API ### 📁 在以下情况使用基于文件的 API: - 构建传统桌面应用程序 - 需要永久文件存储 - 处理非常大的图像(内存限制) - 与基于文件的工作流集成 - 创建归档或备份 ### 🚀 在以下情况使用基于缓冲区的 API: - 构建 Web 服务和 REST API - 上传到云存储(AWS S3、Google Cloud 等) - 创建实时图像处理管道 - 开发无服务器/lambda 函数 - 通过网络流式传输图像数据 - 构建移动应用后端 - 内存到内存处理工作流 ## 故障排除 ### 常见问题 1. **文件未找到错误** - 确保 RAW 文件路径正确 - 检查文件权限 2. **大文件的内存错误** - 使用较低并发性的批量处理 - 对非常大的 RAW 文件进行顺序处理 - 对极大的图像考虑使用基于文件的 API 3. **缓冲区大小错误** - 创建多个大缓冲区时监控内存使用 - 如果内存有限,一次处理一个图像 4. **Sharp 安装问题** - 确保 Sharp 正确安装:`npm install sharp` - 在某些系统上可能需要原生编译 ### 性能提示 1. **缓冲区处理** - 处理多个图像时重用 LibRaw 实例 - 为您的用例使用适当的质量设置 - 考虑调整图像大小以减少缓冲区大小 2. **格式选择** - AVIF:最佳压缩,编码较慢 - WebP:良好压缩,快速编码 - JPEG:通用兼容性,快速编码 - PNG:无损,文件大小较大 - TIFF:专业工作流,各种压缩选项 3. **内存管理** - 完成后始终调用 `processor.close()` - 顺序处理大批量以避免内存问题 - 监控云函数的缓冲区大小限制 ## 贡献 欢迎添加更多示例或改进现有示例!每个示例应该: 1. 包含全面的错误处理 2. 提供清晰的控制台输出 3. 演示特定的 LibRaw 功能 4. 包含性能指标 5. 显示适当的资源清理 6. 在适用时记录文件和缓冲区方法 ## 许可证 这些示例在主要项目的相同许可证下提供。