1,4,8,16,24,32位颜色之间的转换

http://blog.csdn.net/check_into/archive/2007/08/17/1748630.aspx

 

1,4,8,16,24,32位颜色之间的转换
 //  灰度 .299R + .587G + .114B
 #define  PIXEL_GREY(r,g,b) (u8)(((u16)r*77 + (u16)g*150 + (u16)b*29) >> 8)
 
 //  获得 R5G6B5 红色分量
 INLINE u8 R565( u16 clr )
  {
      return  (clr  &   0xF800 )  >>   8 ;
}
 
 //  获得 R5G6B5 绿色分量
 INLINE u8 G565( u16 clr )
  {
       return  (clr  &   0x07E0 )  >>   3 ;
}
 
 //  获得 R5G6B5 蓝色分量
 INLINE u8 B565( u16 clr )
  {
       return  (clr  &   0x001F )  <<   3 ;
}
 
 //  获得 A1R5G5B5 红色分量
 INLINE u8 R1555( u16 clr )
  {
       return  (clr  &   0x7C00 )  >>   7 ;
}
 
 //  获得 A1R5G5B5 绿色分量
 INLINE u8 G1555( u16 clr )
  {
       return  (clr  &   0x03E0 )  >>   2 ;
}
 
 //  获得 A1R5G5B5 蓝色分量
 INLINE u8 B1555( u16 clr )
  {
       return  (clr  &   0x001F )  <<   3 ;
}
 
 //  获得 A1R5G5B5 Alpha值
 INLINE u8 A1555( u16 clr )
  {
       return  clr  &   0x8000   ?   255  :  0 ;
}
 
 //  获得 A4R4G4B4 红色分量
 INLINE u8 R4444( u16 clr )
  {
       return  (clr  &   0x0F00 )  >>   8 ;
}
 
 //  获得 A4R4G4B4 绿色分量
 INLINE u8 G4444( u16 clr )
  {
       return  (clr  &   0x00F0 );
}
 
 //  获得 A4R4G4B4 蓝色分量
 INLINE u8 B4444( u16 clr )
  {
       return  (clr  &   0xF000 )  <<   4 ;
}
 
 //  获得 A4R4G4B4 Alpha值
 INLINE u8 A4444( u16 clr )
  {
       return  (clr  &   0xF000 )  >>   12 ;
}
 
 //  由rgb组合成一个32位的RGB
 INLINE u32 RGB32( u8 r, u8 g, u8 b )
  {
       return  u32(r)  <<   16   |  u32(g)  <<   8   |  u32(b)  |   0xFF000000 ;
}
 
 //  由argb组合成一个32位的ARGB
 INLINE u32 ARGB32( u8 a, u8 r, u8 g, u8 b )
  {
       return  u32(a)  <<   24   |  u32(r)  <<   16   |  u32(g)  <<   8   |  u32(b);
}
 
 // ------------------------------------------------------------------------------------
 //   1位转换到4, 8, 16, 24, 32
 // ------------------------------------------------------------------------------------
 INLINE u16 _1_to_565(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 3 )  |  ((pal[index].Green >> 2 ) << 5 )  |  ((pal[index].Red >> 3 ) << 11 ) );
}
 
INLINE u16 _1_to_1555(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 3 )  |  ((pal[index].Green >> 3 ) << 5 )  |  ((pal[index].Red >> 3 ) << 10 )  |   0x8000  );
}
 
INLINE u16 _1_to_4444(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 4 )  |  ((pal[index].Green >> 4 ) << 4 )  |  ((pal[index].Red >> 4 ) << 8 )  |   0xF000  );
}
 
INLINE  void  _1_to_24(  const  PALETTE  * pal, u16 index, u8  & r, u8  & g, u8  & b )
  {
      b  =  pal[index].Blue;
      g  =  pal[index].Green;
      r  =  pal[index].Red;
}
 
INLINE u32 _1_to_32(  const  PALETTE  * pal, u16 index )
  {
       return  ( pal[index].Blue  |  (pal[index].Green  <<   8 )  |  (pal[index].Red  <<   16 ) );
}
 
 // ------------------------------------------------------------------------------------
 //   4位转换到1, 8, 16, 24, 32
 // ------------------------------------------------------------------------------------
 INLINE u16 _4_to_565(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 3 )  |  ((pal[index].Green >> 2 ) << 5 )  |  ((pal[index].Red >> 3 ) << 11 ) );
}
 
INLINE u16 _4_to_1555(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 3 )  |  ((pal[index].Green >> 3 ) << 5 )  |  ((pal[index].Red >> 3 ) << 10 )  |   0x8000  );
}
 
INLINE u16 _4_to_4444(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 4 )  |  ((pal[index].Green >> 4 ) << 4 )  |  ((pal[index].Red >> 4 ) << 8 )  |   0xF000  );
}
 
INLINE  void  _4_to_24(  const  PALETTE  * pal, u16 index, u8  & r, u8  & g, u8  & b )
  {
      b  =  pal[index].Blue;
      g  =  pal[index].Green;
      r  =  pal[index].Red;
}
 
INLINE u32 _4_to_32(  const  PALETTE  * pal, u16 index )
  {
       return  ( pal[index].Blue  |  (pal[index].Green  <<   8 )  |  (pal[index].Red  <<   16 ) );
}
 
 // ------------------------------------------------------------------------------------
 //   8位转换到16,24,32
 // ------------------------------------------------------------------------------------
 INLINE u16 _8_to_565(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 3 )  |  ((pal[index].Green >> 2 ) << 5 )  |  ((pal[index].Red >> 3 ) << 11 ) );
}
 
INLINE u16 _8_to_1555(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue) >> 3   |  ((pal[index].Green >> 3 ) << 5 )  |  ((pal[index].Red >> 3 ) << 10 )  |   0x8000  );
}
 
INLINE u16 _8_to_4444(  const  PALETTE  * pal, u16 index )
  {
       return  ( (pal[index].Blue >> 4 )  |  ((pal[index].Green >> 4 ) << 4 )  |  ((pal[index].Red >> 4 ) << 8 )  |   0xF000  );
}
 
INLINE  void  _8_to_24(  const  PALETTE  * pal, u16 index, u8  & r, u8  & g, u8  & b )
  {
      b  =  pal[index].Blue;
      g  =  pal[index].Green;
      r  =  pal[index].Red;
}
 
INLINE u32 _8_to_32(  const  PALETTE  * pal, u16 index )
  {
       return  ( pal[index].Blue  |  (pal[index].Green  <<   8 )  |  (pal[index].Red  <<   16 )  |   0xFF000000  );
}
 
 // ------------------------------------------------------------------------------------
 //   16位转换到8,24,32
 // ------------------------------------------------------------------------------------
 INLINE u8 _565_to_8( u16 clr )
  {
       return  PIXEL_GREY( (((clr  &   0xF800 )  >>   11 )  *   0xFF )  /   0x1F ,
           (((clr  &   0x7E0 )  >>   5 )  *   0xFF )  /   0x3F ,
           ((clr  &   0x1F )  *   0xFF )  /   0x1F  );
}
 
INLINE u16 _565_to_1555( u16 clr )
  {
       return  ( (clr  &   0xF800 )  >>   1   |  (clr  >>   1 )  &   0x03E0   |  (clr  &   0x001F )  |   0x8000  );
}
 
INLINE u16 _565_to_4444( u16 clr )
  {
       return  ( ((clr  &   0xF800 )  >>   4 )  |  ((clr  &   0x07E0 )  >>   3 )  |  ((clr  &   0x001F )  >>   1 )  |   0xF000  );
}
 
INLINE  void  _565_to_24( u16 clr, u8  & r, u8  & g, u8  & b )
  {
      r  =  (u8)((clr  &   0xF800 )  >>   11 );
      g  =  (u8)((clr  &   0x07E0 )  >>   5 );
      b  =  (u8)((clr  &   0x001F )  <<   3 );
}
 
INLINE u32 _565_to_32( u16 clr )
  {
       return ( ((clr  &   0x001F )  <<   3 )  |  ((clr  &   0x07E0 )  <<   5 )  |  ((clr  &   0xF800 )  <<   8 )  |   0xFF000000  );
}
 
INLINE u8 _1555_to_8( u16 clr )
  {
       return  PIXEL_GREY( (((clr  &   0x7C00 )  >>   10 )  *   0xFF )  /   0x1F ,
           (((clr  &   0x3E0 )  >>   5 )  *   0xFF )  /   0x1F ,
           ((clr  &   0x1F )  *   0xFF )  /   0x1F  );
}
 
INLINE u16 _1555_to_565( u16 clr )
  {
       return  (u16)( ((clr  &   0x7C00 ) << 1 )  |  ((clr  &   0x03E0 ) << 1 )  |  (clr  &   0x001F ) );
}
 
INLINE u16 _1555_to_4444( u16 clr )
  {
       return  ( ((clr  &   0x7C00 )  >>   3 )  |  ((clr  &   0x03E0 )  >>   2 )  |  ((clr  &   0x001F )  >>   1 )  |   0xF000  );
}
 
INLINE  void  _1555_to_24( u16 clr, u8  & r, u8  & g, u8  & b )
  {
      r  =  (u8)((clr  &   0x7C00 )  >>   10 );
      g  =  (u8)((clr  &   0x03E0 )  >>   5 );
      b  =  (u8)((clr  &   0x001F )  <<   3 );
}
 
INLINE u32 _1555_to_32( u16 clr )
  {
       return ( ((clr  &   0x001F )  <<   3 )  |  ((clr  &   0x03E0 )  <<   6 )  |  ((clr  &   0x7C00 )  <<   9 )  |   0xFF000000  );
}
 
INLINE u16 _4444_to_565( u16 clr )
  {
       return  ( ((clr  &   0x000F )  <<   1 )  |  ((clr  &   0x00F0 )  <<   3 )  |  ((clr  &   0x0F00 )  <<   4 ) );
}
 
INLINE u16 _4444_to_1555( u16 clr )
  {
       return  ( ((clr  &   0x000F )  <<   1 )  |  ((clr  &   0x00F0 )  <<   2 )  |  ((clr  &   0x0F00 )  <<   3 )  |   0x8000  );
}
 
INLINE  void  _4444_to_24( u16 clr, u8  & r, u8  & g, u8  & b )
  {
      r  =  (u8)((clr  &   0x0F00 )  >>   8 );
      g  =  (u8)((clr  &   0x00F0 )  >>   4 );
      b  =  (u8)((clr  &   0x000F )  <<   4 );
}
 
INLINE u32 _4444_to_32( u16 clr )
  {
       return  ( ((clr  &   0x000F )  <<   4 )  |  ((clr  &   0x00F0 )  <<   8 )  |  ((clr  &   0x0F00 )  <<   12 )  |  ((clr  &   0xF000 )  <<   16 ) );
}
 
 // ------------------------------------------------------------------------------------
 //   24位转换到8,16,32
 // ------------------------------------------------------------------------------------
 INLINE u8 _24_to_8( u8 r, u8 g, u8 b )
  {
       return  PIXEL_GREY( b, g, r );
}
 
INLINE u16 _24_to_565( u8 r, u8 g, u8 b )
  {
       return  ( ((u16)(r >> 3 ) << 11 )  |  ((u16)(g >> 2 ) << 5 )  |  ((u16)b >> 3 ) );
}
 
INLINE u16 _24_to_1555( u8 r, u8 g, u8 b )
  {
       return  (  0x8000   |  ((u16)(r >> 3 ) << 10 )  |  ((u16)(g >> 3 ) << 5 )  |  ((u16)b >> 3 ) );
}
 
INLINE u16 _24_to_4444( u8 r, u8 g, u8 b )
  {
       return  (  0xF000   |  ((u16)(r >> 4 ) << 8 )  |  ((u16)(g >> 4 ) << 4 )  |  ((u16)b >> 4 ) );
}
 
INLINE u32 _24_to_32( u8 r, u8 g, u8 b )
  {
       return  (  0xFF000000   |  ((u16)r  <<   16 )  |  ((u16)g  <<   8 )  |  (u16)b );
}
 
 // ------------------------------------------------------------------------------------
 //   32位转换到8,16,24
 // ------------------------------------------------------------------------------------
 INLINE u8 _32_to_8( u32 clr )
  {
       return  PIXEL_GREY( (clr  &   0xFF ), ((clr  &   0xFF00 )  >>   8 ), ((clr  &   0xFF0000 )  >>   16 ) );
}
 
INLINE u16 _32_to_565( u32 clr )
  {
       return  (u16)( ((clr  &   0xF8 )  >>   3 )  |  ((clr  &   0xFC00 )  >>   5 )  |  ((clr  &   0xF80000 )  >>   8 ) );
}
 
INLINE u16 _32_to_1555( u32 clr )
  {
       return  (u16)( ((clr  &   0xF8 )  >>   3 )  |  ((clr  &   0xF800 )  >>   6 )  |  ((clr  &   0xF80000 )  >>   9 )  |   0x8000  );
}
 
INLINE u16 _32_to_4444( u32 clr )
  {
       return  (u16)( ((clr  &   0xF0 )  >>   4 )  |  ((clr  &   0xF000 )  >>   8 )  |  ((clr  &   0xF00000 )  >>   12 )  |  ((clr  &   0xF0000000 )  >>   16 ) );
}
 
INLINE  void   _32_to_24( u32 clr, u8  & r, u8  & g, u8  & b )
  {
      b  =  (u8)(clr  &   0xFF );
      g  =  (u8)((clr  &   0xFF00 )  >>   8 );
      r  =  (u8)((clr  &   0xFF0000 )  >>   16 );
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/check_into/archive/2007/08/17/1748630.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值