#jpegxl #decoder

jxl-oxide

纯 Rust 编写的 JPEG XL 解码器

12 个版本 (7 个重大更新)

0.8.1 2024年7月30日
0.8.0 2024年3月26日
0.7.2 2024年3月4日
0.5.2 2023年12月23日
0.3.0 2023年6月16日

#109 in 图像

Download history 232/week @ 2024-05-04 315/week @ 2024-05-11 471/week @ 2024-05-18 187/week @ 2024-05-25 755/week @ 2024-06-01 442/week @ 2024-06-08 255/week @ 2024-06-15 316/week @ 2024-06-22 286/week @ 2024-06-29 221/week @ 2024-07-06 304/week @ 2024-07-13 313/week @ 2024-07-20 778/week @ 2024-07-27 400/week @ 2024-08-03 412/week @ 2024-08-10 228/week @ 2024-08-17

每月1,891 次下载
4 crate 中使用

MIT/Apache

1MB
21K SLoC

jxl-oxide

jxl-oxide 是一个纯 Rust 编写的 JPEG XL 解码器。它在内部组织成几个小 crate。此 crate 作为外罩,提供由这些 crate 生成的简单接口,以解码实际图像。

查看 crate 级别文档 了解用法。


lib.rs:

jxl-oxide 是一个纯 Rust 编写的 JPEG XL 解码器。它在内部组织成几个小 crate。此 crate 作为外罩,提供由这些 crate 生成的简单接口,以解码实际图像。

解码图像

解码 JPEG XL 图像从构建 JxlImage 开始。首先使用 JxlImage::builder 创建构建器,并使用 open 读取文件

let image = JxlImage::builder().open("input.jxl").expect("Failed to read image header");
println!("{:?}", image.image_header()); // Prints the image header

或者,如果您从实现 Read 的读取器中读取,您可以使用 read

let image = JxlImage::builder().read(reader).expect("Failed to read image header");
println!("{:?}", image.image_header()); // Prints the image header

在异步上下文中,您可能希望直接提供字节缓冲区。在这种情况下,使用 build_uninit 创建一个具有 未初始化状态 的图像结构体,并调用 feed_bytestry_init

#
let mut uninit_image = JxlImage::builder().build_uninit();
let image = loop {
    uninit_image.feed_bytes(reader.read().await?);
    match uninit_image.try_init()? {
        InitializeResult::NeedMoreData(uninit) => {
            uninit_image = uninit;
        }
        InitializeResult::Initialized(image) => {
            break image;
        }
    }
};
println!("{:?}", image.image_header()); // Prints the image header

JxlImage 解析图像头和嵌入的 ICC 配置文件(如果有)。使用 JxlImage::render_frame 渲染图像。

use jxl_oxide::{JxlImage, RenderResult};

for keyframe_idx in 0..image.num_loaded_keyframes() {
    let render = image.render_frame(keyframe_idx)?;
    present_image(render);
}

颜色管理

jxl-oxide 支持基本的颜色管理功能,可以实现知名颜色编码之间的颜色转换以及解析基于矩阵的简单 ICC 配置文件。但是,jxl-oxide 本身不支持任意 ICC 配置文件的转换,特别是 CMYK 配置文件。这包括从嵌入的 ICC 配置文件进行转换。

使用 JxlImage::request_color_encodingJxlImage::request_icc 来设置渲染图像的颜色编码。如果您这样做,可能会发生 ICC 配置文件的转换;在这种情况下,需要使用 JxlImage::set_cms 设置外部 CMS。

let mut image = JxlImage::builder().read(reader).expect("Failed to read image header");
image.set_cms(MyCustomCms);

let color_encoding = EnumColourEncoding::display_p3(RenderingIntent::Perceptual);
image.request_color_encoding(color_encoding);

如果启用了 lcms2 功能,则默认将外部 CMS 设置为 Little CMS 2。您可以通过将 CMS 设置为 NullCms 来明确禁用此功能。

let mut image = JxlImage::builder().read(reader).expect("Failed to read image header");
image.set_cms(NullCms);

不使用 set_cms 进行颜色管理

如果您实现 ColorManagementSystem 对于您的用例来说很困难,可以使用渲染图像的 ICC 配置文件单独进行颜色管理。 JxlImage::rendered_icc 返回 ICC 配置文件以供进一步处理。

use jxl_oxide::{JxlImage, RenderResult};

let icc_profile = image.rendered_icc();
for keyframe_idx in 0..image.num_loaded_keyframes() {
    let render = image.render_frame(keyframe_idx)?;
    present_image_with_cms(render, &icc_profile);
}

功能标志

  • rayon: 启用 Rayon 的多线程。(默认)
  • lcms2: 启用与 Little CMS 2 的集成。

依赖项

~0.6–1.3MB
~25K SLoC