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!("图像处理完成!");
}
性能提示
- 对于大批量处理,尽量使用
convert_image
或convert_buffer
等批量API - 如果处理固定大小的图像,可以重用缓冲区减少分配
- 考虑使用
try_convert
系列方法避免不必要的拷贝
注意事项
- 输入值需要确保在有效范围内(RGB通常在0-255)
- 某些转换可能损失精度,特别是涉及整数和浮点数之间的转换
- 对于实时应用,建议预热测试转换性能