gpt4 book ai didi

c++ - 在缓冲区/数组中使用 Color 结构

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:33 24 4
gpt4 key购买 nike

我正在开发处理(以及其他)图像的库。为了与 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) 吗?或者这会因为对齐而失败吗?

更新(不是真正的答案,但有帮助):我在 boost 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

最佳答案

理论上您可能会遇到对齐问题,但在实践中,我从未见过这种情况发生。

还有一个您没有列举的第三个选项,那就是通过使用 union 来完成这两个选项。类似的东西:

typedef union ARGBPixel {
uint32_t colorValue;
uint8_t components[4]; // <- Or an existing struct with separate a,r,g,b
} ARGBPixel;

通过上面的 union ,同一 block 内存可以被寻址为 uint32_tuint8_t 的数组或结构。

关于c++ - 在缓冲区/数组中使用 Color 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45408244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com