操作系统与网络实现 之八

 

颜色的生成

前面我们使用了一个值0x7ff,将此值填入显卡地址后显示的是一个蓝色的点,那么这个值是怎么来的呢?

色彩是由红、绿、蓝三色按不同配比而组成的. 不同色彩的值经过一定形式组合后,会产生各种不同的色彩。

三种颜色的值从0255,代表三色的强弱,分别对应值0x0 - 0xff。每种颜色是8位,三种颜色就占24位,但是我们的图形模式是16位颜色,其中r:g:b是按5:6:5占位,共16位,24位颜色需要转换成16位颜色,用以下方法转换:<?xml:namespace prefix = o />

r强度值0-255,也就是256种强度值,占八位

要换算成占五位值表示,其值范围0-31,也就是一共32种强度值,那么换算方法是r除以256再乘以32

等于r除以8,相当于右移三位

g强度值0-255,也就是256种强度值,占八位

要换算成占六位值表示,其值范围0-63,也就是一共64种强度值,那么换算方法是g除以256再乘以64

等于g除以4,相当于右移二位

b强度值0-255,也就是256种强度值,占八位

要换算成占五位值表示,其值范围0-31,也就是一共32种强度值,那么换算方法是b除以256再乘以32

等于b除以8,相当于右移三位

函数实现如下:

// rgb合成函数

unsigned short rgb_mix( unsigned char r , unsigned char g , unsigned char b )

{

  union{

    unsigned int color ;

    struct{

      unsigned char b : 5 ;

      unsigned char g : 6 ;

      unsigned char r : 5 ;

    }sa;

  }ua;

  ua.sa.r = r >> 3 ;

  ua.sa.g = g >> 2 ;

  ua.sa.b = b >> 3 ;

  return ua.color ;

}

 

其中g出现了跨字节现象,g的高三位与b组合成了高八位,g的低三位与r组合成了低八位。

一些人说不能跨字节,这是不对的。

编译中会出现警告:note: offset of packed bit-field 'g' has changed in GCC 4.4

可以使用-Wno-packed-bitfield-compat来禁止这个警告。

 

 

转载于:https://www.cnblogs.com/ya20151015/p/4944921.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值