c - 整数类型显示 10 位 RGB 用于显示
问题描述
我很难找到任何关于如何在 C 中为显示器实现 10 位 RGB 输出的开发人员文档,如果可能的话,主要用于 Linux 上的 Xorg/Wayland 并与 Windows 兼容。
目前,我正在处理的应用程序(darktable)uint8_t
用于输出 RGB 值。10 位 uint 的类型是什么?有什么方法可以从代码中检查 GPU/编解码器的 10 位支持吗?
解决方案
我搜索了一下以澄清 10 位 RGB 的含义。
在 Wikipedia Color Depth – Deep color (30/36/48-bit)我发现:
一些早期的系统将三个 10 位通道放在一个 32 位字中,其中 2 位未使用(或用作 4 级 Alpha 通道)。
这似乎是我最合理的。
随之而来的是,红色有 10 位,绿色有 10 位,蓝色有 10 位,+ 2 位未使用(或为 Alpha 保留)。
这留下了两个问题:
它是存储 RGBa 还是 BGRa 还是 aRGB?(我相信我过去已经看到了所有这些变化。)
组合值是存储 Little-Endian 还是 Big-Endian?
当这在实际工作中影响到我时,我基于一个假设进行了实现,呈现了一些测试模式,检查它是否看起来像预期的那样,如果没有交换相应的。实施中的部分。没什么,我很自豪,但是,恕我直言,我以最少的努力得到了预期的结果。
因此,假设我将颜色存储为 RGB 三元组,其分量值在 [0, 1] 范围内,以下函数将其转换为 aRGB:
uint32_t makeRGB30(float r, float g, float b)
{
const uint32_t mask = (1u << 10u) - 1u;
/* convert float -> uint */
uint32_t rU = r * mask, gU = g * mask, bU = b * mask;
/* combine and return color components */
return ((rU & mask) << 20) | ((gU & mask) << 10) | (bU & mask);
}
这会产生具有以下位布局的值:
aaRRRRRR.RRRRGGGG.GGGGGGBB.BBBBBBBB
演示的小样本:
#include <stdint.h>
#include <stdio.h>
uint32_t makeRGB30(float r, float g, float b)
{
const uint32_t mask = (1u << 10u) - 1u;
/* convert float -> uint */
uint32_t rU = r * mask, gU = g * mask, bU = b * mask;
/* combine and return color components */
return ((rU & mask) << 20) | ((gU & mask) << 10) | (bU & mask);
}
int main(void)
{
/* samples */
const float colors[][3] = {
{ 0.0f, 0.0f, 0.0f }, /* black */
{ 1.0f, 0.0f, 0.0f }, /* red */
{ 0.0f, 1.0f, 0.0f }, /* green */
{ 0.0f, 0.0f, 1.0f }, /* blue */
{ 1.0f, 1.0f, 0.0f }, /* yellow */
{ 1.0f, 0.0f, 1.0f }, /* magenta */
{ 0.0f, 1.0f, 1.0f }, /* cyan */
{ 1.0f, 1.0f, 1.0f } /* white */
};
const size_t n = sizeof colors / sizeof *colors;
for (size_t i = 0; i < n; ++i) {
float *color = colors[i];
uint32_t rgb = makeRGB30(color[0], color[1], color[2]);
printf("(%f, %f, %f): %08x\n", color[0], color[1], color[2], rgb);
}
/* done */
return 0;
}
输出:
(0.000000, 0.000000, 0.000000): 00000000
(1.000000, 0.000000, 0.000000): 3ff00000
(0.000000, 1.000000, 0.000000): 000ffc00
(0.000000, 0.000000, 1.000000): 000003ff
(1.000000, 1.000000, 0.000000): 3ffffc00
(1.000000, 0.000000, 1.000000): 3ff003ff
(0.000000, 1.000000, 1.000000): 000fffff
(1.000000, 1.000000, 1.000000): 3fffffff
推荐阅读
- performance - windows10 vs2017和ubuntu g++中的GaussianBlur速度不同?
- python-3.x - Python:根据原始值更改字符串
- c++ - c++ 运算符重载 += 有效,但 << 无效
- python - 将 HTML 数据转换为文本格式 - Python
- java - 如何附加两个文件,它说要连接它们,但它不能正常工作,而且我不断收到错误
- wordpress - 在 WooCommerce 订单页面上显示图像
- android - Glide 不加载 ModelLoader 工厂
- javascript - 尝试通过 Javascript 验证表单,但代码无法正常工作
- django - 如何使用 django 和 jquery 为所有帖子创建一个赞按钮?
- c# - 即使屏幕不活动,如何在睡眠模式下运行循环方法?