【问题标题】:C - RGBA Conversion Not Returning The Desired RGB ResultC - RGBA 转换未返回所需的 RGB 结果
【发布时间】:2017-02-11 03:56:53
【问题描述】:

好的,我有一个方法很难返回所需的结果。所以我做了一个测试结果,它返回了一个我没想到的结果。

这是一个例子 -->

int color = 0x00FFFF00;

return 0xFF & (color >> 24) | 0xFF & (color >> 16) | 0xFF & (color >> 8);

据我所知,这应该返回:

0x00FFFF

然而,它实际上返回:

0x0000FF

有人可以解释发生了什么吗?我也想知道如何正确地将 32 位 RGBA 整数转换为 24 位 RGB 整数,谢谢。

【问题讨论】:

  • 在您应用的每个班次 & 0xFF 因此只有一个有价值的字节,其他都是零。
  • 我知道。我试图在 RGBA 整数中获取特定的颜色值并将它们转换为 RGB 整数,但是,clearlight 已经帮助我完成了这个。无论如何,我也看到我在这里做错了什么。我应该移动红色和绿色元素的结果以匹配 RGB 整数。

标签: c gcc rgb data-conversion rgba


【解决方案1】:

我也发现了我做错了什么。我没有移动整数转换的红色和绿色元素以匹配 RGB 整数--->

int color = 0x00FFFF00;

// Returns 0x0000FF
return 0xFF & (color >> 24) | 0xFF & (color >> 16) | 0xFF & (color >> 8);

这里是固定代码--->

unsigned int color = 0x00FFFF00; // Unsigned Integer to avoid shifting the Two's Complement flag into the RGB value as clearlight pointed out.

// Returns 0x00FFFF
return (0xFF & (color >> 24)) << 16 | (0xFF & (color >> 16)) << 8 | 0xFF & (color >> 8);

【讨论】:

    【解决方案2】:

    试试这个:

    #include <stdio.h>
    int main() {
    
            unsigned int x = 0x00FFFF00;
            printf("0%8.8x", (x >> 8) & 0x00FFFFFF);
    }
    
    $ cc -o shft shft.c
    $ ./shft
    0x0000ffff
    

    如果你把颜色设为unsigned int,那就更好了, 否则你可以得到从左边移入的符号位,但在这种情况下,我们会屏蔽移位的字节,但要小心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多