#pixel #rgba #graphics #color #bgra

rgb

struct RGB/RGBA/etc. 用于在crates之间共享像素 + 颜色操作便捷方法。允许无拷贝的高级互操作性。还添加了常见的便捷方法并实现了标准Rust特质,使 RGB/RGBA 像素和切片成为一等Rust对象。

15个版本

0.8.90-alpha.22024年8月7日
0.8.90-alpha.12024年7月16日
0.8.48 2024年8月7日
0.8.40 2024年6月28日
0.4.0 2016年7月5日

#1图像

Download history 181119/week @ 2024-05-03 185506/week @ 2024-05-10 197240/week @ 2024-05-17 167795/week @ 2024-05-24 229564/week @ 2024-05-31 255246/week @ 2024-06-07 249068/week @ 2024-06-14 287028/week @ 2024-06-21 288993/week @ 2024-06-28 274216/week @ 2024-07-05 277342/week @ 2024-07-12 274857/week @ 2024-07-19 276017/week @ 2024-07-26 280612/week @ 2024-08-02 279748/week @ 2024-08-09 269642/week @ 2024-08-16

1,158,301 每月下载量
用于 1,064 个crates(直接使用162个)

MIT 协议

140KB
2.5K SLoC

Rust 提供像素类型 crate

在像素上作为弱类型 u8 向量操作容易出错且不方便。最好使用像素结构体的向量。然而,Rust的类型如此严格,您的 Rgb 像素结构体与我的 Rgb 像素结构体不兼容。所以让我们都用我的吧 :P

xkcd: …there are 15 competing standards

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的反馈!

  • 特质的名称及其方法是否良好?
  • 您希望在像素类型上实现哪些标准库特质?
  • PixelHetPixelHasAlpha 分开是否合理?(像素支持不同类型的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.3Format特征实现
  • serde = 为像素类型启用serdeSerializableDeserializable特征实现
  • bytemuck = 为像素类型启用bytemuckPodZeroable特征实现

遗留功能

以下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的命名约定:RGBARgba。带有816后缀的名称(如RGBA8)将继续有效。
  • GrayGrayAlpha类型将从带.0的元组结构体变为具有命名字段.v(值)和.a(alpha)的结构体。通过一个Deref技巧,两个字段名都将起作用,但.0将被弃用。
  • bytemuck::Pod(从/到原始字节的转换)将需要颜色和alpha组件具有相同的类型(即它将与Rgba<u8>一起工作,但不能与Rgba<Newtype, DifferentType>一起工作)。目前,如果alpha的大小与颜色组件不同,则这是不安全的。
  • 许多固有方法将被移动到一个新的Pixel特征。

迁移到已弃用项

本包中许多项已因未来版本移除而弃用。以下是您可能需要进行的清单。

  1. 升级到0.8的最新版本,并修复所有弃用警告。
    • .alpha()重命名为.with_alpha()
  2. 尽可能将GrayAlpha的字段访问从.0.1改为.v.a
  3. 使用bytemuck包进行字节间的转换。
  4. 使用num-traits包进行.checked_add(),不要启用checked_fns功能。
  5. 不要启用gbrargb功能。所有像素类型默认启用。
  6. AsRef<[T]>实现已更改为AsRef<[T; N]>。在大多数情况下,.as_ref()/.as_mut()调用应该会强制转换为切片。
  7. 使用pixel.as_ref()代替pixel.as_slice()
  8. 停止使用rgb::Gray/rgb::GrayAlpha类型,分别切换到rgb::Gray_v09 as Gray/rgb::GrayA

依赖项

~0–290KB