convert between RGB565 and RGB888

#include <stdio.h>
#include <stdlib.h>


/* run this program using the console pauser or add your own getch, system("pause") or input loop */


/*


请把RGB(565)格式数据改成RGB(888)格式,即用三个byte表示原来两个byte的数据


565: |           byte0         |            byte1               |
     | x1 x2 x3 x4 x5 x6 x7 x8 | x9 x10 x11 x12 x13 x14 x15 x16 |
888: |         byte0        |          byte1          |          byte2           |
     | 0 0 0 x1 x2 x3 x4 x5 | 0 0 x6 x7 x8 x9 x10 x11 | 0 0 0 x12 x13 x14 x15 x16 |


*/




/*
void rgb565_2_rgb888(unsigned short rgb565);


int main(int argc, char *argv[]) {
unsigned short rgb565 = 0xC618;

    rgb565_2_rgb888(rgb565);

return 0;
}


void rgb565_2_rgb888(unsigned short rgb565)
{
unsigned long rgb888=0;

    rgb888 = rgb565 & 0xf800;
    rgb888 = rgb888 << 8;


    rgb888 = rgb888 | ((rgb565 & 0x07e0) << 5);
    rgb888 = rgb888 | ((rgb565 & 0x001f) << 3);
    
    printf("%lu\n", rgb888);
}*/


typedef unsigned short int   U16;
typedef unsigned char        U8;
typedef unsigned int         U32;
typedef unsigned int          COLOR24;
typedef unsigned short int    COLOR16;


#define RGB565_RED      0xf800
#define RGB565_GREEN    0x07e0
#define RGB565_BLUE     0x001f


#define RGB888_RED      0xff0000
#define RGB888_GREEN    0x00ff00
#define RGB888_BLUE     0x0000ff


typedef union  _T_Color16
{
struct
{
COLOR16    b:5;
COLOR16    g:6;
COLOR16    r:5;
} RGB;
COLOR16 uValue;
} T_Color16;


typedef union _T_Color24
{
struct
{
U8  b;
U8  g;
U8  r;
U8  res;
} RGB;
COLOR24 uValue;
 } T_Color24;


T_Color24 Color16_To_Color24(T_Color16  t_color16)
{
T_Color24 t_color24={0};

t_color24.RGB.r=t_color16.RGB.r << 3;
t_color24.RGB.g=t_color16.RGB.g << 2;
t_color24.RGB.b=t_color16.RGB.b << 3;

return t_color24;
}




COLOR24  rgb565_to_rgb888(COLOR16 color16)
{
COLOR24  color24=color16&RGB565_RED;

color24 <<= 8;
color24 |= (color16&RGB565_GREEN) << 5;
color24 |= (color16&RGB565_BLUE) << 3;

return color24;
}


T_Color16 Color24_To_Color16(T_Color24  t_color24)
{
T_Color16 t_color16={0};

t_color16.RGB.r=t_color24.RGB.r >> 3;
t_color16.RGB.g=t_color24.RGB.g >> 2;
t_color16.RGB.b=t_color24.RGB.b >> 3;

return t_color16;
}




COLOR16  rgb888_to_rgb565(COLOR24 color24)
{
COLOR16  color16=(color24&RGB888_RED) >> 8;

color16 &= 0xf800;
color16 |= ( (color24&RGB888_GREEN) & 0xfc00 ) >> 5 ;
color16 |= (color24&RGB888_BLUE) >> 3;

return color16;
}


int main(int argc,const char* argv[])
{
COLOR24 c;
T_Color16 t_color16;
T_Color24 t_color24;

t_color16.uValue=0X9EDD;
printf("0x%x:color16(r=0x%02x g=0x%02x b=0x%02x)\r\n",
t_color16.uValue,t_color16.RGB.r,t_color16.RGB.g,t_color16.RGB.b);

t_color24=Color16_To_Color24(t_color16);
printf("color24( r=0x%02x g=0x%02x b=0x%02x)\r\n",
t_color24.RGB.r,t_color24.RGB.g,t_color24.RGB.b);


printf("rgb565_to_rgb888(0x%x)=0x%x \r\n",t_color16.uValue,
rgb565_to_rgb888(t_color16.uValue));

printf("rgb888_to_rgb565(0x%x)=0x%x \r\n",rgb565_to_rgb888(t_color16.uValue),
rgb888_to_rgb565(rgb565_to_rgb888(t_color16.uValue)));

system("pause");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值