#profile #icc #color #api-bindings #pixel-format #lcms

lcms2

ICC 颜色配置文件处理。Little CMS 的 Rust 包装器

19 个稳定版本

6.1.0 2024 年 2 月 27 日
6.0.3 2023 年 12 月 1 日
6.0.2 2023 年 11 月 28 日
5.6.0 2023 年 4 月 5 日
0.2.1 2016 年 7 月 15 日

#15 in 图像

Download history 4680/week @ 2024-04-28 5097/week @ 2024-05-05 5496/week @ 2024-05-12 3044/week @ 2024-05-19 4457/week @ 2024-05-26 2365/week @ 2024-06-02 3679/week @ 2024-06-09 4247/week @ 2024-06-16 4193/week @ 2024-06-23 3637/week @ 2024-06-30 4407/week @ 2024-07-07 2944/week @ 2024-07-14 5342/week @ 2024-07-21 4415/week @ 2024-07-28 6231/week @ 2024-08-04 6453/week @ 2024-08-11

22,520 每月下载量
用于 19 个 crate(6 个直接使用)

MIT 许可证

120KB
2.5K SLoC

Little CMSRust 的包装器

使用 LCMS 库的安全抽象层转换和应用颜色配置文件。LCMS2 是一个成熟、功能齐全的颜色管理引擎。这些绑定已经稳定多年,并且在规模生产中使用。

有关 Rust 函数的 API 参考,请参阅 API 参考,以及有关函数的更多背景信息的 LCMS2 文档 HTML/或原始 PDF

use lcms2::*;

fn example() -> Result<(), std::io::Error> {
    let icc_file = include_bytes!("custom_profile.icc"); // You can use Profile::new_file("path"), too
    let custom_profile = Profile::new_icc(icc_file)?;

    let srgb_profile = Profile::new_srgb();

    let t = Transform::new(&custom_profile, PixelFormat::RGB_8, &srgb_profile, PixelFormat::RGB_8, Intent::Perceptual);

    // Pixel struct must have layout compatible with PixelFormat specified in new()
    let source_pixels: &[rgb::RGB<u8>] =;
    t.transform_pixels(source_pixels, destination_pixels);

    // If input and output pixel formats are the same, you can overwrite them instead of copying
    t.transform_in_place(source_and_dest_pixels);

    Ok(())
}

从 JPEG 应用 ICC 配置文件

if b"ICC_PROFILE\0" == &app2_marker_data[0..12] {
   let icc = &app2_marker_data[14..]; // Lazy assumption that the profile is smaller than 64KB
   let profile = Profile::new_icc(icc)?;
   let t = Transform::new(&profile, PixelFormat::RGB_8,
       &Profile::new_srgb(), PixelFormat::RGB_8, Intent::Perceptual);
   t.transform_in_place(&mut rgb);
}

更多示例在 examples 目录中。

此 crate 需要 Rust 1.64 或更高版本。它与 LCMS 2.15 保持最新,并应与广泛版本的版本兼容。

线程

在 LCMS 中,所有函数都有两种风味:全局和 *THR() 函数。在此 crate 中,这通过具有 GlobalContextThreadContext 的函数表示。使用 *_context() 构造函数创建配置文件、转换等,以赋予它们其私有上下文,这使得它们可以在线程之间传递(即它们是 Send)。

默认情况下,Transform 没有实现 Sync,因为 LCMS2 在转换中有一个线程不安全的缓存。您可以通过设置 Flags::NO_CACHE 来使其安全(这是在编译时检查的)。

从 v5 升级

如果您使用的是与 Transform 一起的自定义 RGB 类型,请为它实现 bytemuck::PodZeroable。确保您使用数组或 #[repr(C)] 结构类型来表示像素。Rust 的元组在技术上具有未定义的布局,不能用作像素格式。

unsafe impl Pod for RGB {}
unsafe impl Zeroable for RGB {}

如果您使用 rgb crate,则不需要这样做。

依赖项

~2MB
~45K SLoC