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 |
|
#15 in 图像
22,520 每月下载量
用于 19 个 crate(6 个直接使用)
120KB
2.5K SLoC
Little CMS 对 Rust 的包装器
使用 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 中,这通过具有 GlobalContext
和 ThreadContext
的函数表示。使用 *_context()
构造函数创建配置文件、转换等,以赋予它们其私有上下文,这使得它们可以在线程之间传递(即它们是 Send
)。
默认情况下,Transform
没有实现 Sync
,因为 LCMS2 在转换中有一个线程不安全的缓存。您可以通过设置 Flags::NO_CACHE
来使其安全(这是在编译时检查的)。
从 v5 升级
如果您使用的是与 Transform
一起的自定义 RGB 类型,请为它实现 bytemuck::Pod
和 Zeroable
。确保您使用数组或 #[repr(C)]
结构类型来表示像素。Rust 的元组在技术上具有未定义的布局,不能用作像素格式。
unsafe impl Pod for RGB {}
unsafe impl Zeroable for RGB {}
如果您使用 rgb
crate,则不需要这样做。
依赖项
~2MB
~45K SLoC