9 个版本
0.3.1 | 2024 年 2 月 14 日 |
---|---|
0.2.6 | 2021 年 5 月 11 日 |
0.1.0 | 2021 年 5 月 1 日 |
173 在 图像 中
每月 56 次下载
在 hdrfix 中使用
9.5MB
20K SLoC
jpegxr - 解码 JPEG XR 图像的 Rust 和 JavaScript 包装库
这提供了围绕微软开源的 C libjpegxr / jxrlib 编解码器的 Rust 和 JavaScript 包装器。由于不再积极维护,代码包含在源树中,Codeplex 源代码下载可能不会持续。
目前仅支持解码,但添加编码接口应该是直接的。
作者
包装的 C JPEG XR 库是由微软许多优秀的人编写的!包装它的 Rust 和 JS 代码以及 C 代码的调整由 Brooke Vibber 编写 <bvibber@pobox.com>
。
许可证
BSD 风格许可证;请参阅 license.md
或源文件中的头文件。
Rust 使用方法
use fs;
use jpegxr::{ImageDecode, PixelInfo};
// ...
let input = File::open(filename)?;
let mut decoder = ImageDecode::with_reader(input)?;
let (width, height) = decoder.get_size()?;
let info = PixelInfo::from_format(get_pixel_format()?);
let stride = width * info.bytes_per_pixel() / 8;
let size = stride * height;
let buffer = Vec::<u8>::with_capacity(size);
buffer.resize(size, 0);
decoder.copy_all(&mut buffer, stride)?;
// now do stuff with the data
JS 使用方法
快速入门
let fs = require('fs');
let jpegxr = require('jpegxr');
let bytes = fs.readFileSync(filename);
jpegxr().then((codec) => {
let image = codec.decode(bytes);
let stride = image.width * image.pixelInfo.bitsPerPixel / 8;
// do stuff with image.bytes
});
jpegxr
模块导出一个工厂函数,该函数异步准备 WebAssembly 模块,并通过 Promise
返回一个 API 包装器对象。
使用 decode
方法调用,并传入一个包含输入字节的 Uint8Array
,以获取以下结构的对象
{
width: number,
height: number,
pixelInfo: {
channels: number, // 3, 4 etc
colorFormat: string, // "RGB" etc
bitDepth: string, // "8", "32Float" etc
bitsPerPixel: number, // 24, 32, 128 etc
hasAlpha: boolean,
premultipliedAlpha: boolean,
bgr: boolean, // indicates RGB has blue channel first, not red
},
bytes: Uint8Array
}
在数据无效的情况下可能会抛出异常。此 bytes
数组是独立的,由其自己的缓冲区支持,无需手动释放 -- 但是所有这些都导致了输入和输出数据在 WebAssembly 模块中/外出时的单次复制成本。
功能
目前具有从 JPEG XR 图像中读取基本图像格式(宽度/高度/像素格式)并将其数据解码到内存的能力。计划添加编码,所有部件都在那里,只是还没有设置。
在 Rust API 中,您可以请求图像的子集,这应该允许在解码期间进行渐进显示,或者为了节省时间解码裁剪视图上未使用的宏块。
从 NVIDIA 游戏屏幕捕获工具保存的 32 位浮点 RGBA 元素 HDR 图像似乎可以正确解码。
未来计划
- 添加编码器接口
- 对不常见的东西进行更多测试
构建(JS)
使用 emscripten 构建 JS 应该在 macOS 和 Linux 上工作。在 Windows 上,我建议使用 WSL 设置 Linux 环境。
安装 emscripten SDK 并将其配置到 PATH
中。可以直接运行 make
,或者运行 npm run-script build
,后者会自动运行 make
。
运行 npm test
来执行一个验证脚本,该脚本加载一个样本浮点HDR截图,并计算平均的红色、绿色和蓝色强度,以证明其正确加载。结果应该看起来像这样,不应抛出异常。
% make test
node wasm/test.js
{ decode: [Function: decode] }
{
width: 3440,
height: 1440,
pixelInfo: {
channels: 4,
colorFormat: 'RGB',
bitDepth: '32Float',
bitsPerPixel: 128,
hasAlpha: true,
premultipledAlpha: false,
bgr: false
},
bytes: Uint8Array(79257600) [
0, 0, 136, 58, 0, 0, 250, 58, 0, 0, 63, 59,
0, 0, 0, 0, 0, 0, 136, 58, 0, 0, 250, 58,
0, 0, 63, 59, 0, 0, 0, 0, 0, 0, 136, 58,
0, 0, 248, 58, 0, 0, 63, 59, 0, 0, 0, 0,
0, 0, 136, 58, 0, 0, 246, 58, 0, 0, 62, 59,
0, 0, 0, 0, 0, 0, 136, 58, 0, 0, 250, 58,
0, 0, 63, 59, 0, 0, 0, 0, 0, 0, 136, 58,
0, 0, 250, 58, 0, 0, 63, 59, 0, 0, 0, 0,
0, 0, 136, 58,
... 79257500 more items
]
}
average red brightness: 1.4860534716607372
average green brightness: 2.4572176722254246
average blue brightness: 3.867482314063597