在缓冲区/数组中使用颜色结构
Using a Color struct in a buffer/array
我正在开发一个处理(以及其他(图像的库。为了与 OGL 的互操作性,我需要(至少(写入 BGRA 缓冲区(字节顺序 -> B 优先(
为此,我正在设计一个应该表示颜色的 ColorARGB 类。我想到了两种方法:第一种方法将颜色值存储为uint32_t
并提供到字节缓冲区的转换方法,第二种将组件存储为字节,应该能够直接使用。在代码中:
struct ColorARGB
{
uint32_t clrValue;
ColorARGB(uint32_t clrValue):clrValue(clrValue){}
ColorARGB(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
clrValue = a << 24 | r << 16 | g << 8 | b;
}
static ColorARGB fromBGRA(const uint8_t* ptr)
{
return fromBGRA(reinterpret_cast<const uint32_t*>(ptr));
}
static ColorARGB fromBGRA(const uint32_t* ptr)
{
// This is little endian BGRA word format
return ColorARGB(boost::endian::little_to_native(*ptr));
}
// Similar functions for toBGRA
}
或:
struct ColorARGB2{
uint8_t clrValues[4]; // Or maybe: uint8_t b, g, r, a;
ColorARGB2(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
clrValues[0] = b; clrValues[1] = g;
clrValues[2] = r; clrValues[3] = a;
}
}
第二个版本应该允许std::vector<ColorARGB2>
而第一个版本会有问题,在大端机器上,缓冲区是 ARGB 而不是 BGRA。我也可以只是reinterpret_cast<ColorARGB2*>
,而由于ColorARGB
的原因,
这是不可能的。ColorARGB2有什么问题吗?我会遇到可能的对齐问题,尤其是在处理字节缓冲区(uint8_t*
(时?我可以简单地将比较实现为reinterpret_cast<const uint32_t*>(&lhs) == reinterpret_cast<const uint32_t*>(&rhs)
还是由于对齐而失败?
更新(不是真正的答案,但有帮助(: 我在提升 src 代码中发现了以下内容:
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
// On x86 (which is little endian), unaligned loads are permitted
# define RTTR_USE_UNALIGNED_ACCESS 1
#endif
理论上,您可能会遇到对齐问题,但在实践中,我从未见过这种情况发生。
还有第三个选项尚未枚举,即通过使用联合来执行这两个选项。大致如下:
typedef union ARGBPixel {
uint32_t colorValue;
uint8_t components[4]; // <- Or an existing struct with separate a,r,g,b
} ARGBPixel;
通过上述并集,同一块内存可以寻址为uint32_t
或数组或uint8_t
的结构。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- 将"打开的CV图像"中的"颜色"转换为整数格式
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 在缓冲区/数组中使用颜色结构
- 如何从 GIFLIB 保存图像结构中获取 RGB 颜色数据
- Eclipse Neon.3 更改类型层次结构/调用层次结构中的颜色
- 结构像素颜色值
- 颜色的类层次结构