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 图像
每月1,891 次下载
在 4 crate 中使用
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_bytes
和 try_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_encoding
或 JxlImage::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