【问题标题】:join 16 bits for color per pixel C# [closed]为每像素 C# 加入 16 位颜色 [关闭]
【发布时间】:2021-02-09 03:48:36
【问题描述】:

我有一个问题,我有一个颜色(RGB),每个颜色用 16 位分隔,我想加入 64 位,例如:

R = 0x2222
G = 0xb1b1
B = 0x4c4c
A = 0x0000

如何将其转换为单个数据?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后edit你的问题包含你拥有的完整源代码作为minimal reproducible example,其他人可以编译和测试。
  • 您熟悉位运算符吗?什么是预期的输出 - 例如字节应该以什么顺序出现?
  • 感谢您的回答,我希望 RGBA 以该顺序出现,关于运营商的一些我了解

标签: c#


【解决方案1】:

这有点像this question 的复制品,但它确实有一个独特的地方让你感到困惑,因为否则你会左移超过 32 位 and C# bafflingly only obeys the lower 5 or 6 bits in the shift amount。因此,结合这两个事实:

void Main()
{
    ushort r = 0x2222;
    ushort g = 0xb1b1;
    ushort b = 0x4c4c;
    ushort a = 0x0000;
    
    ulong rgba = r;
    rgba = rgba << 16; // each component is 16 bits long
    rgba = rgba | g;
    rgba = rgba << 16; 
    rgba = rgba | b; 
    rgba = rgba << 16; 
    rgba = rgba | a;
    
    Console.WriteLine($"{rgba:X}");
}

【讨论】:

  • 您也可以这样做:ulong rgba = (ulong)r &lt;&lt; 48 | (ulong)g &lt;&lt; 32 | (ulong)b &lt;&lt; 16 | (ulong)a; - 如果您不先转换为 ulong,那么移位将开始丢失位,但这不是因为 5/6 位该页面上提到的东西,这是因为它在与 | 结合之前移动了 ushort
  • 谢谢@JoeSewell 我已经有了,你之前的消息对我很有帮助,我正在尝试将其存储在二进制文件中。
猜你喜欢
  • 2015-08-04
  • 2012-11-23
  • 2012-04-23
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多