我有一个16位亮度值存储在两个字节中,我想将其转换为R,G和B值。我有两个问题:如何将这两个字节转换为短路,并假设色调和饱和度为0,如何将该短路转换为每个分量RGB值8位?
(Convert类没有选项可以获取两个字节并输出一个短消息。)
答案 0 :(得分:2)
尝试这样的事情:
byte luminance_upper = 23;
byte luminance_lower = 57;
int luminance = ((int)luminance_upper << 8) | (int)luminance_lower;
这将为您提供0-65535之间的值。
当然,如果您只想最终得到32位ARGB(灰度)颜色,那么较低的字节就不重要了,因为您将从16位亮度变为8位R, G,B组件。
byte luminance_upper = 255;
// assuming ARGB format
uint argb = (255u << 24) // alpha = 255
| ((uint)luminance_upper << 16) // red
| ((uint)luminance_upper << 8) // green
| (uint)luminance_upper; // blue (hope my endianess is correct)
根据您的情况,可能有更好的方法。例如,上面的代码执行线性映射,但是通过使用对数曲线将16位值映射到8位RGB分量,可以获得更好看的结果。
答案 1 :(得分:2)
如果16位值是小端和无符号,则第二个字节将是您想要重复3次以创建RGB值的那个,并且您将丢弃另一个字节。或者如果想要一个32位整数的RGB,你可以使用位移并添加或只是将第二个字节乘以0x10101。
答案 2 :(得分:0)
您也需要其他组件(色调和饱和度)。
另外,16位听起来有点奇怪。通常这些值是浮点值。
有很多关于CodeProject的文章可以转换许多色彩空间。