Rust图像处理库jxl-image的使用:高性能JPEG XL格式编解码与图像处理

Rust图像处理库jxl-image的使用:高性能JPEG XL格式编解码与图像处理

jxl-image是一个Rust库,提供与JPEG XL图像头部相关的类型,如图像尺寸信息、颜色编码和动画TPS(每秒帧数)信息。大部分信息都包含在ImageMetadata结构体中。

安装

在项目目录中运行以下Cargo命令:

cargo add jxl-image

或者在Cargo.toml中添加以下行:

jxl-image = "0.13.0"

示例代码

以下是一个完整的示例,展示如何使用jxl-image库处理JPEG XL图像:

use jxl_image::ImageMetadata;

fn main() {
    // 创建一个示例图像元数据
    let mut metadata = ImageMetadata::default();
    
    // 设置图像尺寸
    metadata.size.width = 800;
    metadata.size.height = 600;
    
    // 设置颜色编码
    metadata.color_encoding = jxl_image::ColorEncoding::srgb();
    
    // 如果是动画,可以设置帧率
    metadata.animation.tps_numerator = 30;
    metadata.animation.tps_denominator = 1;
    
    // 打印元数据信息
    println!("Image Metadata:");
    println!("  Size: {}x{}", metadata.size.width, metadata.size.height);
    println!("  Color Encoding: {:?}", metadata.color_encoding);
    
    if metadata.animation.tps_numerator > 0 {
        println!("  Animation FPS: {}/{}", 
            metadata.animation.tps_numerator,
            metadata.animation.tps_denominator);
    }
}

完整示例代码

以下是一个更完整的示例,展示如何从文件读取JPEG XL图像元数据:

use jxl_image::ImageMetadata;
use std::fs::File;
use std::io::BufReader;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 打开JPEG XL文件
    let file = File::open("example.jxl")?;
    let mut reader = BufReader::new(file);
    
    // 从文件读取元数据
    let metadata = ImageMetadata::from_reader(&mut reader)?;
    
    // 打印元数据信息
    println!("Image Metadata:");
    println!("  Size: {}x{}", metadata.size.width, metadata.size.height);
    println!("  Color Encoding: {:?}", metadata.color_encoding);
    
    if metadata.animation.tps_numerator > 0 {
        println!("  Animation FPS: {}/{}", 
            metadata.animation.tps_numerator,
            metadata.animation.tps_denominator);
    }
    
    Ok(())
}

功能特性

  1. 提供JPEG XL图像头部信息的解析和处理
  2. 支持图像尺寸、颜色编码等元数据操作
  3. 支持动画帧率(TPS)设置
  4. 轻量级(仅14.6 KiB)

许可证

jxl-image采用MIT或Apache-2.0双许可证。

这个库是jxl-oxide项目的一部分,专注于提供高性能的JPEG XL格式处理能力。通过简单的API,开发者可以方便地获取和操作JPEG XL图像的元数据信息。


1 回复

Rust图像处理库jxl-image的使用:高性能JPEG XL格式编解码与图像处理

简介

jxl-image是一个纯Rust实现的JPEG XL图像格式编解码库,支持高性能的图像处理操作。JPEG XL是一种现代化的图像格式,提供出色的压缩率同时保持高质量,支持无损和有损压缩、HDR、宽色域等特性。

主要特性

  • 完整的JPEG XL解码支持
  • 基本编码功能
  • 图像处理操作(调整大小、裁剪、色彩转换等)
  • 零依赖(除标准库外)
  • 安全的内存处理

安装

在Cargo.toml中添加依赖:

[dependencies]
jxl-image = "0.3"

完整示例代码

下面是一个完整的示例,展示如何使用jxl-image库进行JPEG XL图像的编解码和基本处理:

use jxl_image::{JxlImage, ColorSpace, ResizeMethod, EncodeParams};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 示例1: 创建并编码一个简单的JPEG XL图像
    create_and_encode_image()?;
    
    // 示例2: 解码现有JPEG XL图像并获取信息
    decode_image_info("output.jxl")?;
    
    // 示例3: 调整图像大小
    resize_image("output.jxl", "resized.jxl", 400, 300)?;
    
    // 示例4: 裁剪图像
    crop_image("output.jxl", "cropped.jxl", 50, 50, 200, 200)?;
    
    // 示例5: 使用自定义参数编码
    custom_encode_image("output.jxl", "custom.jxl")?;
    
    Ok(())
}

// 创建并编码一个简单的JPEG XL图像
fn create_and_encode_image() -> Result<(), Box<dyn std::error::Error>> {
    // 创建5x5像素的RGB图像
    let width = 5;
    let height = 5;
    let mut pixels = Vec::new();
    
    for y in 0..height {
        for x in 0..width {
            // 创建渐变效果
            pixels.push((x * 50) as u8);    // R
            pixels.push((y * 50) as u8);    // G
            pixels.push(128);               // B
        }
    }
    
    // 创建JxlImage实例
    let image = JxlImage::new(width, height, ColorSpace::Rgb, pixels)?;
    
    // 编码并保存
    let encoded_data = image.encode()?;
    std::fs::write("output.jxl", encoded_data)?;
    
    println!("图像已创建并保存为output.jxl");
    Ok(())
}

// 解码JPEG XL图像并获取信息
fn decode_image_info(filename: &str) -> Result<(), Box<dyn std::error::Error>> {
    let data = std::fs::read(filename)?;
    let image = JxlImage::from_bytes(&data)?;
    
    println!("图像信息:");
    println!("宽度: {}", image.width());
    println!("高度: {}", image.height());
    println!("色彩空间: {:?}", image.color_space());
    
    // 解码像素数据
    let pixels = image.decode()?;
    println!("像素数据长度: {} bytes", pixels.len());
    
    Ok(())
}

// 调整图像大小
fn resize_image(
    input: &str, 
    output: &str,
    new_width: u32,
    new_height: u32
) -> Result<(), Box<dyn std::error::Error>> {
    let data = std::fs::read(input)?;
    let mut image = JxlImage::from_bytes(&data)?;
    
    // 使用Lanczos3算法调整大小
    image.resize(new_width, new_height, ResizeMethod::Lanczos3)?;
    
    // 保存调整后的图像
    let resized_data = image.encode()?;
    std::fs::write(output, resized_data)?;
    
    println!("图像已调整大小并保存为{}", output);
    Ok(())
}

// 裁剪图像
fn crop_image(
    input: &str,
    output: &str,
    x: u32,
    y: u32,
    width: u32,
    height: u32
) -> Result<(), Box<dyn std::error::Error>> {
    let data = std::fs::read(input)?;
    let mut image = JxlImage::from_bytes(&data)?;
    
    // 裁剪图像
    image.crop(x, y, width, height)?;
    
    // 保存裁剪后的图像
    let cropped_data = image.encode()?;
    std::fs::write(output, cropped_data)?;
    
    println!("图像已裁剪并保存为{}", output);
    Ok(())
}

// 使用自定义参数编码图像
fn custom_encode_image(
    input: &str,
    output: &str
) -> Result<(), Box<dyn std::error::Error>> {
    let data = std::fs::read(input)?;
    let image = JxlImage::from_bytes(&data)?;
    
    // 自定义编码参数
    let params = EncodeParams {
        quality: 85,        // 质量 (0-100)
        effort: 5,          // 编码速度/压缩率权衡 (1-9)
        lossless: false,    // 是否无损压缩
        ..Default::default()
    };
    
    // 使用自定义参数编码
    let encoded_data = image.encode_with_params(params)?;
    std::fs::write(output, encoded_data)?;
    
    println!("图像已使用自定义参数编码并保存为{}", output);
    Ok(())
}

性能提示

  1. 对于批量处理,重用JxlImage实例可以减少内存分配
  2. 调整effort参数可以平衡编码速度和质量
  3. 解码时如果只需要元数据而不需要像素数据,可以使用JxlImage::read_metadata()

注意事项

  • 当前版本可能不支持JPEG XL的所有高级特性
  • 编码速度可能比参考实现慢,但安全性更高
  • 对于生产环境,建议进行充分的测试

jxl-image库为Rust开发者提供了处理JPEG XL图像的强大工具,结合Rust的安全性和高性能,适合构建图像处理管道和应用程序。

回到顶部