十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rerun 颜色编码 Rgba32 全面解析:sRGB 色彩空间、位布局与三语言 API 实战

Rerun 颜色编码 Rgba32 全面解析:sRGB 色彩空间、位布局与三语言 API 实战 Rerun 颜色编码 Rgba32 全面解析sRGB 色彩空间、位布局与三语言 API 实战【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunRgba32 是 Rerun 数据模型中最核心的颜色编码类型承载了Color、AlbedoFactor、AnnotationInfo等组件与所有 2D/3D 可视化场景的颜色数据。本文以官方类型参考文档为主体结合仓库内 Rust、Python、C 三套 SDK 的源码实现完整解读 Rgba32 的语义约定、32 位内存布局、Arrow 序列化方式并给出可直接落地的构造、转换与批量使用代码示例。Rgba32 的类型语义未预乘 alpha、sRGB gamma、线性 alpha根据官方参考文档 rgba32.md 的定义Rgba32 是An RGBA color with unmultiplied/separate alpha, in sRGB gamma space with linear alpha.即一个alpha 未预乘unmultiplied/separate的 RGBA 颜色RGB 通道处于sRGB gamma 空间而 alpha 通道是线性空间的。三个关键语义点需要特别注意未预乘 alpha颜色值没有被 alpha 通道预先乘过。(r, g, b, a) (255, 0, 0, 128)表示半透明的纯红而不是红值减半后的暗红。这保证了颜色在透明度变化时色相不会漂移也便于在渲染管线中做正确的 alpha 合成。sRGB gamma 空间R/G/B 分量是经 gamma 编码的 8 位数值0–255与屏幕上直接显示的颜色一致。渲染时如果需要做光照等线性运算需要先用 sRGB 传递函数解码为线性值。线性 alphaalpha 分量直接以线性 0–255 表示不经过 gamma 编码。这套约定与 ecoloregui 的颜色库的Color32::from_rgba_unmultiplied完全一致方便在 UI 层直接互转详见下文 Rust API 一节。32 位内存布局最高字节为 R最低字节为 A文档明确规定了 Rgba32 的存储方式The color is stored as a 32-bit integer, where the most significant byte isRand the least significant byte isA.一个Rgba32底层就是一个u32从最高位到最低位依次是 R、G、B、A 四个字节31 23 15 7 0 ┌─────────────────────┬─────────────────────┬─────────────────────┬─────────────────┐ │ R │ G │ B │ A │ └─────────────────────┴─────────────────────┴─────────────────────┴─────────────────┘ 0xRRGGBBAA例如纯红色不透明(255, 0, 0, 255)打包为0xFF0000FF。这一点在仓库的各语言实现中高度一致Rust 扩展实现 rgba32_ext.rs 中from_unmultiplied_rgba通过(r 24) | (g 16) | (b 8) | a完成打包C 头文件 rgba32.hpp 的构造函数与r()/g()/b()/a()访问器同样按rgba 24 0xFF等位移方式取字节Python 端 _color_conversion.py 的u8_array_to_rgba通过把数组逆序为[a, b, g, r]再以uint32重新解释内存得到0xRRGGBBAA打包值。Arrow 数据类型以 UInt32 传输与存储作为 Rerun 类型系统的一部分Rgba32 在 Arrow 层面对应原生的UInt32类型见文档 Arrow datatype 一节。这意味着在日志记录、RRD 文件存储和跨语言数据交换中一个 Rgba32 颜色就是一个 4 字节无符号整数不存在结构体或嵌套的开销。在 Rust 生成代码 rgba32.rs 中可以清晰地看到这条链路ArrowDataType::arrow_data_type()返回DataType::UInt32ToArrow::to_arrow将Rgba32解包为u32构建PrimitiveArrayUInt32Type写入 Arrow 数组FromArrow::from_arrow反向把UInt32Array的每个元素重新包装为Rgba32并通过err_on_nulls拒绝空值。该类型的 loggable 名称是rerun.encodings.Rgba32例如 C 中Loggable 的 ComponentType 常量即声明为rerun.encodings.Rgba32并以arrow::UInt32Builder完成 Arrow 构建。单一事实来源.def.rs 类型定义与代码生成Rerun 的所有 SDK 类型都并非手写三份而是由一份声明式定义统一生成。Rgba32 的权威定义位于 rgba32.def.rs其中标注了#[rerun::rerun_type] #[arrow(transparent)] // Arrow 层透明展开为底层 u32 #[python(aliases int | Sequence[int | float] | npt.NDArray[np.uint8 | np.float32 | np.float64])] #[rust(repr transparent)] #[rerun(state stable)] // 稳定 API不会破坏性变更 pub struct Rgba32 { pub rgba: u32, }#[arrow(transparent)]决定了其 Arrow 表示为裸UInt32#[rerun(state stable)]表明该类型已进入稳定状态可作为长期兼容的公共 API 使用。re_types_builder据此生成 Rust、Python、C 三套绑定各语言文件头部都有 DO NOT EDIT! This file was auto-generated 注释可验证如 rgba32.rs、rgba32.hpp。Rust API构造、转换与常量Rust 侧通过扩展文件 rgba32_ext.rs 提供了完整的实用方法生成的结构体本身是#[repr(transparent)]的pub struct Rgba32(pub u32)见 rgba32.rs并派生了Copy、PartialEq、Ord、Hash、bytemuck::Pod等 trait。构造方法方法说明示例from_rgb(r, g, b)由 sRGB gamma 空间的 0–255 三通道构造alpha 自动置 255Rgba32::from_rgb(255, 0, 0)from_unmultiplied_rgba(r, g, b, a)由未预乘的四通道构造Rgba32::from_unmultiplied_rgba(255, 0, 0, 128)from_u32(rgba)直接由打包好的0xRRGGBBAA构造Rgba32::from_u32(0xFF0000FF)from_linear_unmultiplied_rgba_f32(r, g, b, a)由 0–1 线性空间 sRGB 值构造有损转换需ecolorfeatureRgba32::from_linear_unmultiplied_rgba_f32(1.0, 0.0, 0.0, 1.0)反向转换to_array(self) - [u8; 4]返回[r, g, b, a]字节数组to_u32(self) - u32返回打包后的0xRRGGBBAA整数。预定义常量Rgba32::BLACKfrom_rgb(0, 0, 0)Rgba32::WHITEfrom_rgb(255, 255, 255)Rgba32::TRANSPARENTfrom_unmultiplied_rgba(0, 0, 0, 0)即完全透明。From 转换支持Rgba32实现了丰富的From转换几乎任何颜色形态都可以无缝流入From(u8, u8, u8)、From(u8, u8, u8, u8)元组直接构造From[u8; 3]、From[u8; 4]数组直接构造Fromu32/FromRgba32 for u32与打包整数互转ecolorfeature 下与ecolor::Color32、ecolor::Rgba双向互转UI 层取色、颜色拾取器可直接复用。组件包装ColorRgba32 最常见的载体是Color组件。组件定义 color.def.rs 中pub rgba: rerun::encodings::Rgba32直接内嵌该编码其扩展实现 color_ext.rs 提供了同名便捷 APIColor::from_rgb、Color::from_u32、Color::new(impl IntoRgba32)等。值得注意的是Color::default()返回WHITE注释中给出的理由见 color_ext.rs是白色作为乘法因子不改变任何颜色且在多数场景下比黑色更可见。Python API灵活的多形态输入与自动类型推断Python 端在 rgba32_ext.py 中实现了非常宽容的输入解析官方类型别名见 rgba32.def.rs为int | Sequence[int | float] | npt.NDArray[np.uint8 | np.float32 | np.float64]Rgba32接受三种形态的输入打包整数int或可转为 int 的对象直接视为0xRRGGBBAA打包值0–255 的序列长度 3 或 4 的Sequence[int]或np.uint8数组按[r, g, b, (a)]解释0–1 的浮点数组np.float32/np.float64数组会被乘以 255 并四舍五入到 0–255 的 sRGB 空间浮点颜色约定见 rgba32.def.rs。Rgba32Batch则进一步接受 Nx3 或 Nx4 的批量数组、Rgba32实例序列以及异构序列整数、子序列混合。核心转换逻辑rgba__field_converter_override与native_to_pa_array_override会按上述规则依次尝试推断rr.Rgba32(255, 0, 0) # (255,0,0) → 0xFF0000FF rr.Rgba32([255, 0, 0, 128]) # 未预乘 RGBA rr.Rgba32(0xFF0000FF) # 直接打包值 rr.Rgba32(np.array([1.0, 0.0, 0.0])) # 0-1 浮点乘 255 取整浮点到 gamma 的转换曲线当输入为 0–1 浮点时linear_to_gamma_u8_value 实现了标准的 sRGB 传递函数与 Rust 参考实现逐行对应if l 0.0031308: round(3294.6 * l) # 线性段 else: round(269.025 * l^(1/2.4) - 14.025) # 幂律段对于 RGBA 浮点像素linear_to_gamma_u8_pixel 仅对 RGB 三个通道做 gamma 编码alpha 通道保持线性np.around(255 * alpha)这与RGB 处于 sRGB gamma、alpha 处于线性空间的类型语义完全吻合。歧义输入告警Python 实现还内置了歧义防护当传入长度 3 或 4 的数组但值不全小于 256 时会发出RerunWarning提示用户如果本意是0xRRGGBBAA打包值应显式以np.uint32类型包裹见 rgba32_ext.py。C API构造与分量访问C 端 rgba32.hpp 提供struct Rgba32 { uint32_t rgba; }及以下便捷接口rerun::encodings::Rgba32 c1(255, 0, 0); // (r, g, b)alpha 默认 255 rerun::encodings::Rgba32 c2(255, 0, 0, 128); // (r, g, b, a) 未预乘 rerun::encodings::Rgba32 c3(uint8_t[4]{...}); // 数组构造 rerun::encodings::Rgba32 c4(0xFF0000FFu); // 直接打包值 uint8_t r c1.r(); // 0xFF uint8_t g c1.g(); // 0x00 uint8_t b c1.b(); // 0x00 uint8_t a c1.a(); // 0xFFr()/g()/b()/a()访问器分别通过(rgba 24) 0xFF、(rgba 16) 0xFF、(rgba 8) 0xFF、rgba 0xFF解包分量与位布局约定一一对应。使用场景Color、AlbedoFactor、AnnotationInfo 与语义分割文档 Used by 一节列出了三个直接使用 Rgba32 的类型Color最通用的颜色组件被Points2D/Points3D、Boxes2D/Boxes3D、LineStrips2D/LineStrips3D、Arrows2D/Arrows3D、Mesh3D、GaussianSplats3D、SeriesLines、GraphNodes、GeoPoints等 20 余个 Archetype 使用覆盖几乎所有可视化实体AlbedoFactor整实体级别的颜色乘数通常用于Asset3D、Mesh3D的材质反照率调节。注意它承载的是乘数语义因此默认值选白色乘法中性元最为安全AnnotationInfo标注类别的颜色与标签其定义 annotation_info.def.rs 中pub color: Optionrerun::encodings::Rgba32以可选字段形式引用 Rgba32。一个典型的端到端场景是语义分割可视化。在 segmentation_image.rs 的内嵌示例中每个像素是ClassId颜色由AnnotationContext映射而来let annotation rerun::AnnotationContext::new([ (1, red, rerun::Rgba32::from_rgb(255, 0, 0)), (2, green, rerun::Rgba32::from_rgb(0, 255, 0)), ]); rec.log_static(/, annotation)?; rec.log(/image, rerun::SegmentationImage::from_image(image)?)?;此处Rgba32::from_rgb直接为类别提供标注颜色观感与数据分离——标签颜色可以随时调整而无需重写图像数据。实践要点小结始终使用未预乘 alpha传入四通道颜色时alpha 不要与 RGB 相乘半透明渲染交给 Viewer 的合成管线处理区分 gamma 与线性RGB 通道按 0–255 的 sRGB gamma 值传入只有在使用浮点0–1输入时才走 gamma 编码曲线且 alpha 始终按线性解释打包值注意字节序0xRRGGBBAA中 R 在最高字节、A 在最低字节与其他库如 0xAABBGGRR 的 BGRA 打包不同混用时务必显式转换批量性能Python 批量传色优先使用np.uint8的 Nx3/Nx4 数组或np.uint32打包数组避免逐元素构造开销默认值语义Color::default()与AlbedoFactor语义上的中性值是白色0xFFFFFFFF乘法运算不改变颜色透明度场景才使用TRANSPARENT。通过本文的文档 源码对照你可以放心地在 Rust、Python、C 任一 SDK 中正确构造、转换和批量提交 Rgba32 颜色并理解其在 Arrow 数据链路中的真实形态从而避免常见的颜色空间与 alpha 语义陷阱。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表