#jpeg #xr #codec #decoding #microsoft #wrapper #jxr

jpegxr

Microsoft 的 C JPEG XR 图像编解码器库的包装器

9 个版本

0.3.1 2024 年 2 月 14 日
0.2.6 2021 年 5 月 11 日
0.1.0 2021 年 5 月 1 日

173图像

Download history 1/week @ 2024-05-14 9/week @ 2024-05-21 1/week @ 2024-05-28 5/week @ 2024-06-04 1/week @ 2024-06-11 2/week @ 2024-06-18

每月 56 次下载
hdrfix 中使用

BSD-3-Clause

9.5MB
20K SLoC

C 19K SLoC // 0.1% comments Rust 715 SLoC // 0.1% comments JavaScript 99 SLoC // 0.0% comments

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

依赖项