【问题标题】:RGB color system as a data typeRGB 颜色系统作为数据类型
【发布时间】:2014-04-03 21:47:09
【问题描述】:

一个 RGB 颜色系统可以通过组合不同深浅的红色、绿色和蓝色来表示 256 种不同的颜色。每个阴影都可以表示为一个数字。定义一个 C 类型来表示 RGB 状态。

据我了解,这将是一个合适的 C 类型,但不确定我是否正确:

struct{
    int R[256];
    int G[256];
    int B[256];
} color;

这是正确的还是有更合适/更有效的方法?

【问题讨论】:

  • 结构中的ints 不需要是数组。只需简单的int 就足够了(或short,甚至unsigned char)。除此之外,应该没问题。
  • 请注意,问题陈述说它可以表示 256 种颜色,而不是像这里发布的许多人所假设的那样每个通道 256 种颜色。
  • 符合规定的解决方案可能是:struct colour { unsigned int R: 3; unsigned int G: 3; unsigned int B: 2; };。我不知道曾经存在的任何系统实际上以这种方式具有 256 种颜色(VGA 有一个 256 色调色板,但这些颜色中的每一种都是 18 位)。

标签: c


【解决方案1】:

您所需要的只是一个可以容纳 三个 值的结构,每个值都在0..255 范围内。您提出的结构包含 3*256 * sizeof(int) = 768 * sizeof(int),太多了。改用这个:

struct color {
    unsigned char R;
    unsigned char G;
    unsigned char B;
};

注意结构标识符color的正确放置。

您将在您的程序中进一步使用此结构,如下所示:

struct color bright_orange;

bright_orange.R = 255;
bright_orange.G = 128;
bright_orange.B = 0;

【讨论】:

    【解决方案2】:

    数组字段是不必要的。单个int 可以保存从 0 到 255 的值,因此足以表示每个阴影。但是,uint8_t 更小,并且明确地传达了所需的值范围:

    #include <stdint.h> //Contains uint8_t
    typedef struct color {
        uint8_t R;
        uint8_t G;
        uint8_t B;
    } color_t;
    
    color_t very_red;
    very_red.R = 255U;
    very_red.G = 0U;
    very_red.B = 0U;
    

    注意typedef 如何让您随后引用color_t 而不必编写struct color

    【讨论】:

      【解决方案3】:

      一个int 是4 个字节,所以3 个int 是12 个字节。

      如果您使用 3 个unsigned char(每个只占用 1 个字节),您可以节省 75% 的空间(如果我们不计算最终的填充)。

      而且这里不需要数组。

      这句话也是错误的:“可以代表 256 种不同的颜色”它是 256 * 256 * 256 种颜色...

      【讨论】:

        【解决方案4】:

        这是错误的。删除数组,然后在 struct 之后移动颜色。您尝试(使用错误的语法)创建一个颜色结构,其中包含大小为 256(每个 256 个 int 值)的 R、G 和 B 数组。 结构颜色{ 诠释R, 整数 G, 诠释B };

        顺便说一句:你只需要 8 位来处理 R、G、B 的 256 个状态。所以 uint8_t (unsigned char) 会比 int 更好。

        【讨论】:

          猜你喜欢
          • 2012-01-30
          • 2020-01-16
          • 2019-02-08
          • 2015-06-13
          • 2018-06-16
          • 2016-02-29
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          相关资源
          最近更新 更多