Rust色彩处理库dcv-color-primitives的使用:高效颜色空间转换与基础色彩操作

Rust色彩处理库dcv-color-primitives的使用:高效颜色空间转换与基础色彩操作

DCV Color Primitives是一个用于执行图像颜色模型转换的Rust库。它具有以下设计特点:

  • 支持底层硬件优化(最高支持avx2指令集)
  • 支持单缓冲或多平面图像数据输入
  • 支持非紧密打包的数据
  • 支持大于4GB的图像(64位)
  • 支持ARM架构(aarch64)
  • 支持WebAssembly

支持的图像格式转换

以下是当前支持的像素格式转换表:

源像素格式 目标像素格式
ARGB I420, I444, NV12
BGR I420, I444, NV12, RGB
BGRA I420, I444, NV12, RGB
I420 BGRA, RGBA
I444 BGRA, RGBA
NV12 BGRA, RGB, RGBA
RGB BGRA

支持的颜色模型

支持以下两种颜色模型:

  • YCbCr(ITU-R BT.601标准视频系统)
  • YCbCr(ITU-R BT.709 CSC系统)

同时支持标准范围(0-235)和全范围(0-255)。

完整示例代码

以下是使用dcv-color-primitives进行图像格式转换的完整示例:

// 导入必要的库和模块
use dcv_color_primitives as dcp;
use dcp::{convert_image, get_buffers_size, ColorSpace, ImageFormat, PixelFormat};
use std::error;

fn main() -> Result<(), Box<dyn error::Error>> {
    // 定义图像尺寸
    const WIDTH: u32 = 1920;
    const HEIGHT: u32 = 1080;
    
    // 1. 准备源数据 (RGBA格式)
    let src_format = ImageFormat {
        pixel_format: PixelFormat::Rgba,
        color_space: ColorSpace::Rgb,
        num_planes: 1,
    };
    
    // 计算源缓冲区大小
    let mut src_sizes = [0usize; 1];
    get_buffers_size(WIDTH, HEIGHT, &src_format, None, &mut src_sizes)?;
    let mut src_data = vec![0u8; src_sizes[0]];
    
    // 填充模拟数据 (实际应用中应使用真实图像数据)
    for i in 0..src_data.len() / 4 {
        src_data[i * 4] = (i % 255) as u8;      // R
        src_data[i * 4 + 1] = (i % 255) as u8;  // G
        src_data[i * 4 + 2] = (i % 255) as u8;  // B
        src_data[i * 4 + 3] = 255;              // A
    }
    
    // 2. 准备目标数据 (I420格式)
    let dst_format = ImageFormat {
        pixel_format: PixelFormat::I420,
        color_space: ColorSpace::Bt709,
        num_planes: 3,  // I420需要3个平面
    };
    
    // 计算目标缓冲区大小
    let mut dst_sizes = [0usize; 3];
    get_buffers_size(WIDTH, HEIGHT, &dst_format, None, &mut dst_sizes)?;
    
    let mut dst_y = vec![0u8; dst_sizes[0]];   // Y平面
    let mut dst_u = vec![0u8; dst_sizes[1]];   // U平面
    let mut dst_v = vec![0u8; dst_sizes[2]];   // V平面
    
    // 3. 执行图像转换
    convert_image(
        WIDTH,
        HEIGHT,
        &src_format,
        None,  // 不使用自定义步长
        &[&src_data],  // 源数据
        &dst_format,
        None,  // 不使用自定义步长
        &mut [&mut dst_y, &mut dst_u, &mut dst_v],  // 目标数据
    )?;
    
    println!("成功将RGBA图像({}x{})转换为I420格式!", WIDTH, HEIGHT);
    
    // 4. 可选: 将I420转换回RGB
    let rgb_format = ImageFormat {
        pixel_format: PixelFormat::Rgb,
        color_space: ColorSpace::Rgb,
        num_planes: 1,
    };
    
    let mut rgb_size = [0usize; 1];
    get_buffers_size(WIDTH, HEIGHT, &rgb_format, None, &mut rgb_size)?;
    let mut rgb_data = vec![0u8; rgb_size[0]];
    
    convert_image(
        WIDTH,
        HEIGHT,
        &dst_format,
        None,
        &[&dst_y, &dst_u, &dst_v],
        &rgb_format,
        None,
        &mut [&mut rgb_data],
    )?;
    
    println!("成功将I420图像转换回RGB格式!");
    
    Ok(())
}

系统要求

  • Rust 1.70或更新版本

安装

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

cargo add dcv-color-primitives

或者在Cargo.toml中添加:

dcv-color-primitives = "0.7.0"

许可证

该库采用MIT-0许可证。


1 回复

Rust色彩处理库dcv-color-primitives的使用指南

概述

dcv-color-primitives是一个高效的Rust色彩处理库,专注于颜色空间转换和基础色彩操作。它提供了多种颜色模型之间的转换功能,并支持基本的色彩操作,适用于图像处理、计算机视觉和图形学应用。

主要特性

  • 支持多种颜色空间转换(RGB, BGR, HSV, HSL, XYZ, Lab, Luv等)
  • 高性能实现,利用SIMD指令优化
  • 线程安全的API设计
  • 支持批量处理像素数据

安装

在Cargo.toml中添加依赖:

[dependencies]
dcv-color-primitives = "0.3"

基本使用方法

单个颜色转换

use dcv_color_primitives as color;
use color::{ColorSpace, Convertible};

fn main() {
    // 创建RGB颜色
    let rgb = color::Rgb::new(255, 0, 128);
    
    // 转换为HSV
    let hsv: color::Hsv = rgb.convert();
    println!("HSV: {:?}", hsv);
    
    // 转换为Lab
    let lab: color::Lab = rgb.convert();
    println!("Lab: {:?}", lab);
}

批量颜色转换

use dcv_color_primitives as color;
use color::{ColorSpace, Convertible};

fn main() {
    // 创建RGB像素数组
    let rgb_pixels = vec![
        color::Rgb::new(255, 0, 0),
        color::Rgb::new(0, 255, 0),
        color::Rgb::new(0, 0, 255),
    ];
    
    // 批量转换为HSV
    let hsv_pixels: Vec<color::Hsv> = rgb_pixels.convert();
    
    // 批量转换为XYZ
    let xyz_pixels: Vec<color::Xyz> = rgb_pixels.convert();
}

图像数据转换

use dcv_color-primitives as color;

fn main() {
    // 假设有一个RGB图像缓冲区 (宽度x高度x3)
    let width = 640;
    let height = 480;
    let mut rgb_buffer = vec![0u8; width * height * 3];
    
    // 转换为灰度
    let mut gray_buffer = vec![0u8; width * height];
    color::convert_image(
        &rgb_buffer,
        &mut gray_buffer,
        width,
        height,
        color::PixelFormat::RGB,
        color::PixelFormat::GRAY,
    ).unwrap();
    
    // 转换为BGR格式
    let mut bgr_buffer = vec![0u8; width * height * 3];
    color::convert_image(
        &rgb_buffer,
        &mut bgr_buffer,
        width,
        height,
        color::PixelFormat::RGB,
        color::PixelFormat::BGR,
    ).unwrap();
}

高级功能

自定义转换参数

use dcv_color_primitives as color;

fn main() {
    let rgb = color::Rgb::new(255, 128, 64);
    
    // 使用自定义白点进行XYZ转换
    let xyz: color::Xyz = rgb.convert_with_params(
        color::ConvertParams::default()
            .with_white_point(color::WhitePoint::D65)
    );
}

色彩通道操作

use dcv_color_primitives as color;

fn main() {
    let mut rgb = color::Rgb::new(255, 128, 64);
    
    // 调整亮度
    rgb.adjust_brightness(1.2);
    
    // 调整饱和度
    rgb.adjust_saturation(0.8);
    
    // 获取亮度值
    let luminance = rgb.luminance();
}

完整示例代码

以下是一个完整的图像处理示例,展示了如何使用dcv-color-primitives进行图像色彩空间转换和调整:

use dcv_color_primitives as color;
use color::{ColorSpace, Convertible, PixelFormat};
use image::{DynamicImage, GenericImageView};

fn main() {
    // 1. 加载图像
    let img = image::open("input.jpg").expect("Failed to open image");
    let (width, height) = img.dimensions();
    
    // 2. 转换为RGB缓冲区
    let mut rgb_buffer = vec![0u8; (width * height * 3) as usize];
    if let DynamicImage::ImageRgb8(rgb_img) = img.to_rgb8() {
        rgb_buffer.copy_from_slice(rgb_img.as_raw());
    }
    
    // 3. 转换为HSV颜色空间
    let mut hsv_buffer = vec![0u8; (width * height * 3) as usize];
    color::convert_image(
        &rgb_buffer,
        &mut hsv_buffer,
        width as usize,
        height as usize,
        PixelFormat::RGB,
        PixelFormat::HSV,
    ).unwrap();
    
    // 4. 调整图像饱和度
    let rgb_pixels: Vec<color::Rgb> = rgb_buffer
        .chunks_exact(3)
        .map(|chunk| color::Rgb::new(chunk[0], chunk[1], chunk[2]))
        .collect();
    
    let adjusted_pixels: Vec<color::Rgb> = rgb_pixels
        .into_iter()
        .map(|mut rgb| {
            rgb.adjust_saturation(1.5); // 增加50%饱和度
            rgb
        })
        .collect();
    
    // 5. 转换回图像缓冲区
    let mut adjusted_buffer = vec![0u8; (width * height * 3) as usize];
    for (i, rgb) in adjusted_pixels.into_iter().enumerate() {
        adjusted_buffer[i*3] = rgb.r;
        adjusted_buffer[i*3+1] = rgb.g;
        adjusted_buffer[i*3+2] = rgb.b;
    }
    
    // 6. 保存处理后的图像
    let output_img = image::RgbImage::from_raw(width, height, adjusted_buffer)
        .expect("Failed to create output image");
    output_img.save("output.jpg").expect("Failed to save image");
    
    println!("图像处理完成!");
}

性能提示

  1. 对于大批量处理,尽量使用convert_imageconvert_buffer等批量API
  2. 如果处理固定大小的图像,可以重用缓冲区减少分配
  3. 考虑使用try_convert系列方法避免不必要的拷贝

注意事项

  • 输入值需要确保在有效范围内(RGB通常在0-255)
  • 某些转换可能损失精度,特别是涉及整数和浮点数之间的转换
  • 对于实时应用,建议预热测试转换性能
回到顶部