【发布时间】:2009-11-11 19:27:36
【问题描述】:
我有两个类模板 Color3_t 和 Color4_t,分别存储 3 和 4 个颜色通道,如下所示:
template <typename TYPE>
struct Color3_t
{
TYPE Red;
TYPE Green;
TYPE Blue;
void Zero()
{
Red = Green = Blue = 0;
}
(...)
}
这两个模板都有几个用于反转、交换等颜色通道的功能,我得到了另一个继承这些类的专用模板——以防 TYPE 是半浮点数或浮点数而不是整数。
问题在于颜色通道的顺序:红色、绿色和蓝色目前是固定的——这意味着我必须为其他颜色通道顺序(如 BGR、GRB 等)创建一个 Color3_t 类模板版本。 )。如何提供不同颜色顺序的参数 - 很可能指向如下颜色结构。
RGB 和 BGR 颜色顺序的颜色数据结构:
template <typename TYPE>
struct ColorRGB_t
{
TYPE Red;
TYPE Green;
TYPE Blue;
};
template <typename TYPE>
struct ColorBGR_t
{
TYPE Blue;
TYPE Green;
TYPE Red;
};
以及我想拥有的东西 - 这显然是错误和不正确的,但应该说明我想要实现的目标。
template <typename TYPE, class COLORORDER<TYPE>>
struct Color3_t : public COLORORDER<TYPE>
{
void Zero()
{
Red = Green = Blue = 0;
}
(...)
};
我也想直接访问每个颜色通道:
typedef Color3_t<BYTE,ColorBGR_t<BYTE>> ColorRGB8bpc;
ColorRGB8bpc oColor;
oColor.Red = 0;
代替:
oColor.SomoObject.Red = 0;
【问题讨论】:
-
成员的顺序何时重要?
-
还有。为什么顺序很重要?
-
用于访问数组或内存缓冲区中的这些对象(结构) - 从文件加载原始数据后 - 通过名称而不是直接索引 0、1、2 访问它们。我还得到了在不同颜色/像素格式上运行的图像类,并且使用通道名称而不是数字更容易。不同的文件格式使用不同的顺序,例如 BMP 图像使用 RGB,TGA 使用 BGR 更不用说更容易从 ULONG/DWORD 中提取 4 通道颜色值。
-
如果以
Color3_t访问原始内存不会产生未定义的行为,我会感到惊讶。也就是说,当您验证它在您的平台上执行您想要的操作时,您可能想要采用 Dima 的想法,但是让他的getX()函数调用到一个特征类中,传递数组。然后特征类可以确定颜色的顺序。 -
将数据(无论以何种形式出现)转换为一种相同的内部类型不是更简单吗?我不明白为什么,如果文件使用 RGB 或 BGR,您的内部表示应该使用相同的顺序。