directX的16位和24位的色彩模式

#deine _RGB16BIT555(r,g,b) ((b&31) + ((g&31) << 5) + ((r&31) << 10))

因为这个是16位色5551格式的

X R4 R3 R2 R1 R0 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

因此31转化成二进制与的话、就是5个1(11111)、假设传来的RGB值都为11111、那么

B就为11111

G就为1111100000

R就为111110000000000

所以三者相加就为111111111111111、刚好就一一对应上面的表格、因为PC机采用低字节在前的格式、数据通常是从低位到高位、而这个色彩位组却是相反的、采用了高字节在前的格式、因为读起来符合RGB的顺序、所以填充的时候要相反来填充、所以就是以BGR的顺序来填充、剩下的最后一个高位X是用来填充成16位数据的、无任何意义、所以实际的RGB数据就为

0111111111111111

类似的、16位色除了有X555的排列、还有565的排列、也就是说G为6位、刚好就够了不用X来填充16位数据、因此数据为

R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

所以产生565的16位色宏为

#define _RGB16BIT565(r,g,b) ((b&31) + ((g&63) << 5) + ((r&31) << 11))

这里类似的先将31和63转换成二进制、31刚好是5位数11111、63刚好是6位数111111、所以也就符合了565的排列了、一如往前、也设定传来的色彩白色、那么

b就是11111

g就是11111100000

r就是1111100000000000

那么加起来狠自然也是16位的白色了1111111111111111

除了X555和565排列外、还有一种A555的16位、无非就是把X这个无用位替换成ALPHA通道、使其来控制透明色

===============================================

剩下的24位和32位的宏就不再推导了、给出了相应的宏

#define _RGB24BIT(r,g,b) (b + (g << 8) + (r << 16))

24位采用888的位排列

还有32位的、32位采用了8888的排列、也就是ARGB或者XRGB、其实ARGB也就是带有透明通道的色彩模式、而XRGB则是完全模拟24位的色彩模式、为啥呢、因为32不能被3整除、所以RGB不能均匀的排布在32位的数据上、所以现实的情况是许多视频显卡都不能3位3位地定位、所以便转换成8888的模式、其中前8位就是用来填充数据的、照理说迩可以随便填充任意1或0、不过建议填充为8个0比较保险、所以一个模拟24位的32位色彩的白色便 是

00000000111111111111111111111111

原文地址:https://www.cnblogs.com/klobohyz/p/2509466.html