15个版本
0.8.90-alpha.2 | 2024年8月7日 |
---|---|
0.8.90-alpha.1 | 2024年7月16日 |
0.8.48 | 2024年8月7日 |
0.8.40 | 2024年6月28日 |
0.4.0 |
|
#1 在 图像
1,158,301 每月下载量
用于 1,064 个crates(直接使用162个)
140KB
2.5K SLoC
为 Rust 提供像素类型
在像素上作为弱类型 u8
向量操作容易出错且不方便。最好使用像素结构体的向量。然而,Rust的类型如此严格,您的 Rgb
像素结构体与我的 Rgb
像素结构体不兼容。所以让我们都用我的吧 :P
v0.8.90 是一个过渡/预览版本
RGB crate 正在获得重大更新,最终将稳定为 v1.0.0。
对于 测试,使用
[dependencies]
rgb = "0.8.90"
# this is required, because v0.8.90 is not on crates.io
[patch.crates-io]
rgb.git = "https://github.com/kornelski/rust-rgb"
我们欢迎您对crates的反馈!
- 特质的名称及其方法是否良好?
- 您希望在像素类型上实现哪些标准库特质?
- 将
Pixel
、HetPixel
、HasAlpha
分开是否合理?(像素支持不同类型的alpha通道,并且有不含alpha的Rgbw
)。
请在仓库中打开问题以提供反馈 或向 @[email protected] 发送消息。
安装
如果您想运行稳定、兼容的版本,请运行 cargo add [email protected]
。如果您想尝试不稳定实验版本,请运行 cargo add [email protected]
或将其添加到您的 Cargo.toml
[dependencies]
rgb = "0.8.90-alpha.1" # unstable experimental version
# rgb = "0.8.47" # older, stable
用法
use rgb::{Rgb, Rgba, Argb, Bgr, Bgra, Abgr, Grb, Gray_v09 as Gray, GrayA};
let rgb = Rgb {r: 0, g: 0, b: 0};
let rbga = Rgba {r: 0, g: 0, b: 0, a: 0};
let argb = Argb {a: 0, r: 0, g: 0, b: 0};
let bgr = Bgr {b: 0, g: 0, r: 0};
let bgra = Bgra {b: 0, g: 0, r: 0, a: 0};
let abgr = Abgr {r: 0, g: 0, b: 0, a: 0};
let grb = Grb {g: 0, b: 0, r: 0};
let gray = Gray {v: 0};
let gray_a = GrayA {v: 0, a: 0};
如果您想使用尚未实现的自定义像素类型,请提交一个 issue 请求您的像素类型。
具有 alpha 分量的像素类型(如 Rgba
)有两个泛型类型参数
struct Rgba<T, A = T> {
r: T,
g: T,
b: T,
a: A,
}
这使得它们更灵活,适用于更多用例,例如,如果您需要比 alpha 分量更精确的颜色分量,您可以创建一个 Rgba<f32, u8>
。然而,在大多数用例中,alpha 分量类型将与颜色分量类型相同。
具有独立颜色和 alpha 分量类型的像素称为异构像素(HetPixel
),而具有单一颜色和 alpha 分量类型像素称为同构像素(Pixel
)。
像素特性
所有像素类型的函数都通过特性实现。这意味着像素类型,如 Rgb<u8>
,没有任何固有方法。这使得您可以轻松选择在任何给定时间希望存在的作用域内的方法,而固有方法总是存在于作用域内。
此软件包提供了以下特性
HetPixel
每个像素类型实现的最基础像素特性。
use rgb::{Rgba, HetPixel};
let mut rgba: Rgba<u8> = Rgba::try_from_colors_alpha([0, 0, 0], 0).unwrap();
*rgba.color_array_mut()[2] = u8::MAX;
assert_eq!(rgba.color_array(), [0, 0, 255]);
*rgba.alpha_opt_mut().unwrap() = 50;
assert_eq!(rgba.alpha_opt(), Some(50));
let rgba = rgba.map_colors(u16::from);
let rgba = rgba.map_colors_same(|c| c * 2);
let rgba = rgba.map_alpha(f32::from);
let rgba = rgba.map_alpha_same(|a| a * 2.0);
assert_eq!(rgba, Rgba::<u16, f32> {r: 0, g: 0, b: 510, a: 100.0});
Pixel
比 HetPixel
更严格的特性,其中两个分量类型,颜色和 alpha,是相同的。
use rgb::{Rgba, Pixel};
let mut rgba: Rgba<u8> = Rgba::try_from_components([0, 0, 0, 0]).unwrap();
*rgba.each_mut()[2] = u8::MAX;
assert_eq!(rgba.to_array(), [0, 0, 255, 0]);
let rgba = rgba.map(u16::from);
let rgba = rgba.map_same(|c| c * 2);
assert_eq!(rgba, Rgba::<u16> {r: 0, g: 0, b: 510, a: 0});
GainAlpha
以各种方式向像素类型添加 alpha 的方法。
use rgb::{Rgb, Rgba, GainAlpha};
let expected: Rgba<u8> = Rgba {r: 0, g: 0, b: 0, a: 255};
assert_eq!(Rgb {r: 0, g: 0, b: 0}.with_default_alpha(255), expected);
assert_eq!(Rgb {r: 0, g: 0, b: 0}.with_alpha(255), expected);
assert_eq!(Rgba {r: 0, g: 0, b: 0, a: 0}.with_alpha(255), expected);
HasAlpha
仅在具有 alpha 分量的像素上实现的一个特性。
由于与几个已弃用的同名固有函数(如 Rgb::alpha()
)存在命名冲突,因此 HasAlpha::alpha()
方法需要完全限定语法以消除歧义。这些弃用函数将在未来的版本中删除,这将解决此问题。
use rgb::{Rgba, HasAlpha};
let mut rgba: Rgba<u8> = Rgba {r: 0, g: 0, b: 0, a: 255};
*rgba.alpha_mut() -= 50;
assert_eq!(HasAlpha::alpha(&rgba), 205);
Bytemuck
如果您有一个 &[u8]
或 Vec<u8>
类型,并且您想转换为一个 &[Rgb<u8>]
或 Vec<Rgb<u8>>
类型,则可以通过 bytemuck
软件包(请参阅 cast_slice()
和 cast_vec()
)安全地进行这些类型转换。
要使用此软件包中的像素类型上的 bytemuck
库函数,您需要启用 bytemuck
软件包功能。
软件包功能
default
:默认功能,不做任何事情。num-traits
:启用对像素类型(如CheckedAdd
)的多种num_traits
特征实现。defmt-03
= 启用像素类型对defmt
v0.3
的Format
特征实现serde
= 为像素类型启用serde
的Serializable
和Deserializable
特征实现bytemuck
= 为像素类型启用bytemuck
的Pod
和Zeroable
特征实现
遗留功能
以下crate功能仅用于与v0.8
版本兼容,以保持非破坏性,但一旦迁移到v0.9
,您就不再应该使用这些功能。它们将在下一个主版本(在v0.9
之后)中删除。
argb = []
grb = []
checked_fns = []
as-bytes = ["bytemuck"]
颜色空间无关
这个crate故意对像素类型的颜色空间保持无关,例如,Gray<u8>
可以是线性亮度或伽玛校正的亮度等。
正确的颜色管理是一个复杂的问题,这个crate旨在成为最低公共分母,所以它故意对此保持无关。
然而,这个库支持任何子像素类型用于RGB<T>
和RGBA<RGBType, AlphaType>
,所以您可以使用它们与newtype一起使用,例如。
# use rgb::Rgb;
struct LinearLight(u16);
type LinearRGB = Rgb<LinearLight>;
通往1.0的道路
计划提供到v1.0的简单迁移。将发布一个过渡的v0.9版本,它与0.8大致向后兼容,与1.0向前兼容。
计划中的更改
- 类型将被重命名为遵循Rust的命名约定:
RGBA
→Rgba
。带有8
或16
后缀的名称(如RGBA8
)将继续有效。 Gray
和GrayAlpha
类型将从带.0
的元组结构体变为具有命名字段.v
(值)和.a
(alpha)的结构体。通过一个Deref
技巧,两个字段名都将起作用,但.0
将被弃用。bytemuck::Pod
(从/到原始字节的转换)将需要颜色和alpha组件具有相同的类型(即它将与Rgba<u8>
一起工作,但不能与Rgba<Newtype, DifferentType>
一起工作)。目前,如果alpha的大小与颜色组件不同,则这是不安全的。- 许多固有方法将被移动到一个新的
Pixel
特征。
迁移到已弃用项
本包中许多项已因未来版本移除而弃用。以下是您可能需要进行的清单。
- 升级到0.8的最新版本,并修复所有弃用警告。
- 将
.alpha()
重命名为.with_alpha()
- 将
- 尽可能将
GrayAlpha
的字段访问从.0
和.1
改为.v
和.a
。 - 使用
bytemuck
包进行字节间的转换。 - 使用
num-traits
包进行.checked_add()
,不要启用checked_fns
功能。 - 不要启用
gbr
和argb
功能。所有像素类型默认启用。 AsRef<[T]>
实现已更改为AsRef<[T; N]>
。在大多数情况下,.as_ref()
/.as_mut()
调用应该会强制转换为切片。- 使用
pixel.as_ref()
代替pixel.as_slice()
。 - 停止使用
rgb::Gray
/rgb::GrayAlpha
类型,分别切换到rgb::Gray_v09 as Gray
/rgb::GrayA
。
依赖项
~0–290KB