#color-conversion #color #xyz #image #graphics #cie-lab

nightly colortypes

为 Rust nightly 提供一个抽象、安全且简洁的色彩转换库

14 个版本 (5 个破坏性更新)

0.6.2 2022年11月18日
0.6.1 2022年6月5日
0.5.1 2022年5月14日
0.4.2 2022年5月10日
0.1.4 2022年5月2日

#356 in 图像

Download history 10/week @ 2024-04-01

每月下载量:55

MIT 许可证

75KB
2K SLoC

colortypes

crates.io Documentation

一个类型安全的色彩转换库

此 crate 提供了在颜色类型之间转换的多种方法。

所有内容都是抽象实现的,并且易于用户扩展。

转换时,请在您的颜色上调用 colortype 结构体的 from_color 方法!

实现转换

方法
RGB XYZ 直接转换
RGB HSV 直接转换
RGB HSL 直接转换
RGB LCH 通过 XYZ 转换
RGB LAB 通过 XYZ 转换
LAB LCH 直接转换
RGB YcBcR 直接转换

示例用法

use colortypes::prelude::*;

fn main() {
    // You can directly call Rgba this way (defaults to D65)
    let color = Rgba::new::<D65>([0.0, 0.0, 0.0, 1.0]);
    // Or can call Color and specify Rgba this way
    let color = Color::<Rgb, D65>::new([0.0, 0.0, 0.0, 1.0]);

    // To convert to Xyza
    let new_color = Xyz::from_color(color);

    // To adapt to a a new white point
    let new_color = Xyz::adapt_chroma::<D50>(color);

    // To clamp the values between a range
    let new_color = color.clamp(0.0,1.0);

    // To clamp the values within the color space
    let new_color = color.clamp_to_gamut();
}

颜色还直接实现了以下 f64 方法作为方法

sqrt, cbrt, cos, cosh, acos, acosh, sin, sinh, asin, asinh, tan, tanh, atan, atanh,abs, floor, ceil, round, exp, exp2, exp_m1, ln, ln_1p, log2, log10, recip, signum, powf, atan2, log, max, min, hypot, div_euclid, rem_euclid, mul_add, clamp

let new_color = my_color.mul_add_color(my_other_color, my_third_color);

复杂用法

pub const MYCOLORSPACE: ColorGamut = ColorGamut {
    // Here you construct the primaries in the xyY space
    // Col3(x, y, Y)
    primaries_xyy: [
        Col3(0.7350, 0.2740, 0.1670),
        Col3(0.2650, 0.7170, 0.0090),
        Col3(0.176204, 0.812985, 0.010811),
    ],
    // Here you reference the transfer functions
    transfer_fn: srgb_companding,
    transfer_fn_inv: srgb_inv_companding,
    // This is the conversion matrix intended for use from
    // XYZ to your color space
    conversion: Mat3(
        Col3(0.4887180, 0.3106803, 0.2006017),
        Col3(0.1762044, 0.8129847, 0.0108109),
        Col3(0.0000000, 0.0102048, 0.9897952),
    ),
    // Here you not the reference white point used
    white: E,
};
// With this you can define your own custom color space
impl_colorspace! {
    MyColorSpace<MY_COLOR_GAMUT &MY_REFERENCE_WHITE>
        [0.0..1.0, 0.0..1.0, 0.0..1.0],
}
// You'll notice
// [0.0..1.0, 0.0..1.0, 0.0..1.0]
// These are the ranges for each channel

// Heres CIELCH for example
impl_colorspace! {
    CIELch<CIELAB&E>
        [0.0..100.0, 0.0..133.0, 0.0..360.0],   
}

// Then you can implement your conversion method
impl_conversion!(|color: MyColorSpace| -> Rgb {
    // Code to convert
    ...
    // Construct your Color
    Color::new([new_ch.0, new_ch.1, new_ch.2, color.3])
});

图像

此 crate 还提供了一种处理图像的类型,目前仍在开发中

use colortypes::{Align, Image, Rgba, Xyya, SRGB};

fn main() {
    // Images can be constructed in two ways:
    let mut img = Image::<Rgba, D65>::new((6000, 4000));
    let mut img = Image::<Rgba, D65>::new_with((6000, 4000), Rgba::new([0.0, 0.0, 0.0, 1.0]));

    // You can place pixels and return pixels
    img.put_pixel((0, 0), Rgba::new([0.7, 0.3, 0.2, 1.0])).unwrap();
    img.get_pixel((0, 0)).unwrap();

    let new_img = img.convert::<Xyya>();
    let new_img_b = img.convert::<Xyya>();
    let mut new_img = ((new_img + new_img_b) / 2.0).convert::<Rgba>();

    new_img = new_img.crop_align((Align::Front, Align::Front), (256, 256));

    let my_col = new_img.get_pixel((0, 0));
}

Image 还提供了各种迭代方法

 // There are various iteration methods

    pixels()
    Iterator<&Color>

    pixels_mut()
    Iterator<&mut Color>

    pixels_zip(&Image)
    Iterator<(&Color, &Color)>

    pixels_mut_zip(&Image)
    Iterator<(&mut Color, &Color)>

    pixels_zip_mut(&mut Image)
    Iterator<(&Color, &mut Color)>

    pixels_mut_zip_mut(&mut Image)
    Iterator<(&mut Color, &mut Color)>

    for_each_pixel(FnMut(&Color))
    Iterator<&Color>

    for_each_pixel_mut(FnMut(&Color))
    Iterator<&mut Color>

    map_pixels(FnMut(&Color) -> Color)
    Iterator<Color>

    map_f()
    Iterator<f64>

    map_pixels_with(&image)
    Iterator<Color>

    map_pixels_to::<ColorType>()
    Iterator<Color>

    map_pixels_to_with::<ColorType>(&Image)
    Iterator<(Color, &Color)>

依赖项