将16位亮度值转换为32位RGB

时间:2009-07-28 04:56:49

标签: c# .net image

我有一个16位亮度值存储在两个字节中,我想将其转换为R,G和B值。我有两个问题:如何将这两个字节转换为短路,并假设色调和饱和度为0,如何将该短路转换为每个分量RGB值8位?

(Convert类没有选项可以获取两个字节并输出一个短消息。)

3 个答案:

答案 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的文章可以转换许多色彩空间。

相关问题