RGB565,RGB24,YUV

本文详细介绍了RGB888与RGB565之间的相互转换方法,并提供了具体的宏代码实现。此外,还深入探讨了YUV422到RGB的转换过程,包括计算公式及通过查表法进行高效转换的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RGB888转RGB565

  • 24ibt RGB888:

    第4字节第3字节第2字节第1字节
    R7 R6 R5 R4 R3 R2 R1 R0G7 G6 G5 G4 G3 G2 G1 G0B7 B6 B5 B4 B3 B2 B1 B0

    要转化成565的格式,那数据如下:

    • 16bit RGB565:
    高字节低字节
    前4位后4位前8位后8位
    R7 R6 R5 R4R3 G7 G6 G5G4 G3 G2 B7B6 B5 B4 B3

    由上看出当RGB888->RGB565时,去掉了低bit位的信息,取的都是各分量的高位信息。因此损失了精度。

    宏代码:

    
    #define _RGB565(r,g,b)       ( \
    
                                        (__uint16_t)((r&0xf8)<<8) \
                                      | (__uint16_t)((g&0xfc)<<3) \
                                      | (__uint16_t)((b&0xf8)>>3) \
                                 )
    
    
    #define _RGB565(r,g,b)       (\
    
                                       ((__uint16_t)(r << 8) & 0xf800) \
                                     | ((__uint16_t)(g << 3) & 0x07e0) \
                                     | ((__uint16_t)(b >> 3) & 0x001f)\
                                 )

RGB565转RGB888

那反过来如果RGB565–>RGB888时,肯定有空数据,那我们也可以做些精度补偿

  • 16bit RGB565:

    高字节低字节
    前4位后4位前8位后8位
    R4 R3 R2 R1R0 G5 G4 G3G2 G1 G0 B4B3 B2 B1 B0

    要转化成888的格式,那数据如下:

    • 24ibt RGB888:
    第4字节第3字节第2字节第1字节
    R4 R3 R2 R1 R0 R2 R1 R0G5 G4 G3 G2 G1 G0 G1 G0B4 B3 B2 B1 B0 B2 B1 B0

    加粗加斜的就是补偿值了。宏代码自己据此写就好。

YUV422转RGB

YUV422的排列格式:(数据在内存地址由低到高排)
Y0U0Y1V0 Y2U2Y3V2 … …
这里写图片描述
两个Y共用一对UV值,所以每4个字节对应两个像素点。
计算公式网上找了个:

Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

参考【视频处理】YUV与RGB格式转换利用查表法:

//yuv是以4字节为单位递增,rgb则以8字节递增。这样每次处理两个像素点。
void yuyv2rgb32(__uint32_t *yuyv_buf, __uint64_t *rgb_buf)
{
    int r,g,b;
    __uint8_t u,v,i;
    __uint8_t y[2];
    int rv,guv,bu;
    __uint32_t *fb_buf = (__uint32_t *)rgb_buf;
    __uint8_t *yuv8 = (__uint8_t *)yuyv_buf;

    y[0]=(__uint8_t)*yuv8;
    u=(__uint8_t)*(yuv8+1);
    y[1]=(__uint8_t)*(yuv8+2);
    v=(__uint8_t)*(yuv8+3);

    rv=rvarrxyp[v];
    guv=guarrxyp[u]+gvarrxyp[v];
    bu=buarrxyp[u];

    for(i=0;i<2;i++){
        r=y[i]+rv;
        g=y[i]-guv;
        b=y[i]+bu;
        if(r>255) r=255;//不做此处理会有雪花点。
        else if(r<0) r=0;
        if(g>255) g=255;
        else if(g<0) g=0;
        if(b>255) b=255;
        else if(b<0) b=0;
        *(fb_buf+i)=_RGB(r,g,b);  //RGB888,如果要做565的,可以处理下,但数据类型要注意换。
    }
}

void yuv2rgb(const void *yuyv,__uint16_t width,__uint16_t height, void *rgb)
{
    __uint16_t x,y;
    __uint32_t *yuyv_ptr =(__uint32_t *)yuyv;
    __uint64_t *rgb_ptr = (__uint64_t *)rgb;
    for(y = 0; y < height;  y++)
        for(x = 0; x < width/2; x++)
            yuyv2rgb32((__uint32_t *)yuyv_ptr + y*width/2+x,
                     (__uint64_t *)rgb_ptr + y*width/2 + x);
}

//YUV422转换为RGB表

const int rvarrxyp[]={
-180,-179,-177,-176,-175,-173,-172,-170,-169,-167,-166,-165,-163,-162,-160,-159,-158,-156,-155,-153,-152,-151,
-149,-148,-146,-145,-144,-142,-141,-139,-138,-137,-135,-134,-132,-131,-129,-128,-127,-125,-124,-122,-121,-120,
-118,-117,-115,-114,-113,-111,-110,-108,-107,-106,-104,-103,-101,-100,-99,-97,-96,-94,-93,-91,-90,-89,-87,-86,
-84,-83,-82,-80,-79,-77,-76,-75,-73,-72,-70,-69,-68,-66,-65,-63,-62,-61,-59,-58,-56,-55,-53,-52,-51,-49,-48,
-46,-45,-44,-42,-41,-39,-38,-37,-35,-34,-32,-31,-30,-28,-27,-25,-24,-23,-21,-20,-18,-17,-15,-14,-13,-11,-10,
-8,-7,-6,-4,-3,-1,0,1,3,4,6,7,8,10,11,13,14,15,17,18,20,21,23,24,25,27,28,30,31,32,34,35,37,38,39,41,42,44,45,
46,48,49,51,52,53,55,56,58,59,61,62,63,65,66,68,69,70,72,73,75,76,77,79,80,82,83,84,86,87,89,90,91,93,94,96,
97,99,100,101,103,104,106,107,108,110,111,113,114,115,117,118,120,121,122,124,125,127,128,129,131,132,134,135,
137,138,139,141,142,144,145,146,148,149,151,152,153,155,156,158,159,160,162,163,165,166,167,169,170,172,173,175,
176,177,179};

const int guarrxyp[]={
-44,-44,-44,-43,-43,-42,-42,-42,-41,-41,-41,-40,-40,-40,-39,-39,-39,-38,-38,-38,-37,-37,-37,-36,-36,-36,-35,-35,
-35,-34,-34,-34,-33,-33,-32,-32,-32,-31,-31,-31,-30,-30,-30,-29,-29,-29,-28,-28,-28,-27,-27,-27,-26,-26,-26,-25,
-25,-25,-24,-24,-23,-23,-23,-22,-22,-22,-21,-21,-21,-20,-20,-20,-19,-19,-19,-18,-18,-18,-17,-17,-17,-16,-16,-16,
-15,-15,-15,-14,-14,-13,-13,-13,-12,-12,-12,-11,-11,-11,-10,-10,-10,-9,-9,-9,-8,-8,-8,-7,-7,-7,-6,-6,-6,-5,-5,-4,
-4,-4,-3,-3,-3,-2,-2,-2,-1,-1,-1,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,6,6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,11,11,12,12,
12,13,13,13,14,14,15,15,15,16,16,16,17,17,17,18,18,18,19,19,19,20,20,20,21,21,21,22,22,22,23,23,23,24,24,25,25,25,
26,26,26,27,27,27,28,28,28,29,29,29,30,30,30,31,31,31,32,32,32,33,33,34,34,34,35,35,35,36,36,36,37,37,37,38,38,38,
39,39,39,40,40,40,41,41,41,42,42,42,43,43,44,44};

const int gvarrxyp[]={
-92,-91,-90,-90,-89,-88,-87,-87,-86,-85,-85,-84,-83,-82,-82,-81,-80,-80,-79,-78,-77,-77,-76,-75,-75,-74,-73,-72,
-72,-71,-70,-70,-69,-68,-67,-67,-66,-65,-65,-64,-63,-62,-62,-61,-60,-60,-59,-58,-57,-57,-56,-55,-54,-54,-53,-52,-52,
-51,-50,-49,-49,-48,-47,-47,-46,-45,-44,-44,-43,-42,-42,-41,-40,-39,-39,-38,-37,-37,-36,-35,-34,-34,-33,-32,-32,-31,
-30,-29,-29,-28,-27,-27,-26,-25,-24,-24,-23,-22,-22,-21,-20,-19,-19,-18,-17,-16,-16,-15,-14,-14,-13,-12,-11,-11,-10,
-9,-9,-8,-7,-6,-6,-5,-4,-4,-3,-2,-1,-1,0,1,1,2,3,4,4,5,6,6,7,8,9,9,10,11,11,12,13,14,14,15,16,16,17,18,19,19,20,21,
22,22,23,24,24,25,26,27,27,28,29,29,30,31,32,32,33,34,34,35,36,37,37,38,39,39,40,41,42,42,43,44,44,45,46,47,47,48,49,
49,50,51,52,52,53,54,54,55,56,57,57,58,59,60,60,61,62,62,63,64,65,65,66,67,67,68,69,70,70,71,72,72,73,74,75,75,76,77,
77,78,79,80,80,81,82,82,83,84,85,85,86,87,87,88,89,90,90,91};

const int buarrxyp[]={
-228,-226,-224,-222,-221,-219,-217,-215,-213,-212,-210,-208,-206,-205,-203,-201,-199,-197,-196,-194,-192,-190,-189,
-187,-185,-183,-181,-180,-178,-176,-174,-173,-171,-169,-167,-165,-164,-162,-160,-158,-157,-155,-153,-151,-149,-148,
-146,-144,-142,-141,-139,-137,-135,-133,-132,-130,-128,-126,-125,-123,-121,-119,-117,-116,-114,-112,-110,-109,-107,
-105,-103,-101,-100,-98,-96,-94,-93,-91,-89,-87,-85,-84,-82,-80,-78,-76,-75,-73,-71,-69,-68,-66,-64,-62,-60,-59,-57,
-55,-53,-52,-50,-48,-46,-44,-43,-41,-39,-37,-36,-34,-32,-30,-28,-27,-25,-23,-21,-20,-18,-16,-14,-12,-11,-9,-7,-5,-4,
-2,0,2,4,5,7,9,11,12,14,16,18,20,21,23,25,27,28,30,32,34,36,37,39,41,43,44,46,48,50,52,53,55,57,59,60,62,64,66,68,69,
71,73,75,76,78,80,82,84,85,87,89,91,93,94,96,98,100,101,103,105,107,109,110,112,114,116,117,119,121,123,125,126,128,
130,132,133,135,137,139,141,142,144,146,148,149,151,153,155,157,158,160,162,164,165,167,169,171,173,174,176,178,180,
181,183,185,187,189,190,192,194,196,197,199,201,203,205,206,208,210,212,213,215,217,219,221,222,224,226};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值