#jpegxl #api-bindings

jpegxl-rs

JPEG XL 参考实现的安全 Rust 封装

27 个版本

0.10.4+libjxl-0.10.32024年6月30日
0.10.2+libjxl-0.10.22024年3月21日
0.8.3+libjxl-0.8.22023年10月13日
0.8.2+libjxl-0.8.22023年6月14日
0.1.4 2020年8月25日

44图像 中排名

Download history 404/week @ 2024-05-04 191/week @ 2024-05-11 130/week @ 2024-05-18 324/week @ 2024-05-25 136/week @ 2024-06-01 311/week @ 2024-06-08 266/week @ 2024-06-15 189/week @ 2024-06-22 627/week @ 2024-06-29 190/week @ 2024-07-06 361/week @ 2024-07-13 115/week @ 2024-07-20 262/week @ 2024-07-27 180/week @ 2024-08-03 146/week @ 2024-08-10 217/week @ 2024-08-17

870 每月下载量
simp 中使用

GPL-3.0-or-later

155KB
3K SLoC

jpegxl-rs

Documentation Crates.io dependency status CI codecov License: GPL-3.0-or-later

libjxl 库上创建的一个安全的 JPEGXL 封装。查看原始 绑定

构建

如果您想指定自定义库路径,请设置环境变量 DEP_JXL_LIB

可以使用 vendored 功能启用构建 libjxl 和静态链接。

如果您不想依赖 C++ 标准库,请禁用功能 threads

使用

目前,支持 u8u16f16f32 作为像素类型。

解码

let mut decoder = decoder_builder().build()?;
let (Metadata { width, height, ..}, pixels) = decoder.decode(&sample)?;
match pixels {
    Pixels::Float(data) => { /* do something with Vec<f32> data */ },
    Pixels::Uint8(data) => { /* do something with Vec<u8> data */ },
    Pixels::Uint16(data) => { /* do something with Vec<u16> data */ },
    Pixels::Float16(data) => { /* do something with Vec<f16> data */ },
}

// Multi-threading
use jpegxl_rs::ThreadsRunner;
let runner = ThreadsRunner::default();
let mut decoder = decoder_builder()
                      .parallel_runner(&runner)
                      .build()?;

// Customize pixel format
let mut decoder = decoder_builder()
                      .pixel_format(PixelFormat {
                          num_channels: 3,
                          endianness: Endianness::Big,
                          align: 8
                      })
                      .build()?;

decoder.decode_with::<u8>(&sample);

// You can change the settings after initialization
decoder.skip_reorientation = Some(true);

// Reconstruct JPEG, fallback to pixels if JPEG reconstruction is not possible
// This operation is finished in on pass
let (metadata, data) = decoder.reconstruct(&sample)?;
match data {
    Data::Jpeg(jpeg) => {/* do something with the JPEG data */}
    Data::Pixels(pixels) => {/* do something with the pixels data */}
}

编码

use image::io::Reader as ImageReader;
let sample = ImageReader::open("../samples/sample.png")?.decode()?.to_rgba16();
let mut encoder = encoder_builder().build()?;
let buffer: EncoderResult<f32> = encoder.encode(&sample, sample.width(), sample.height())?;

设置编码器选项

let mut encoder = encoder_builder()
                    .lossless(true)
                    .speed(EncoderSpeed::Falcon)
                    .build()?;
// You can change the settings after initialization
encoder.lossless = false;
encoder.quality = 3.0;

image crate 集成

集成默认启用。如果您不需要它,请禁用 image 功能。

use jpegxl_rs::image::ToDynamic;
use jpegxl_rs::decoder_builder;
use image::DynamicImage;

let sample = std::fs::read("../samples/sample.jxl")?;
let mut decoder = decoder_builder().build()?;
let img = decoder.decode_to_image(&sample)?;
let img = decoder.decode_to_image_with::<f32>(&sample)?;

许可证:GPL-3.0-or-later

依赖项

~3MB
~64K SLoC