YCbCr与RGB转换

YCbCr与RGB转换

有些平台上的颜色要求是YCbCr的. 通常对颜色值上,RGB用的比较多.
下列是一个转换示例.
核心是两个函数中的各3行. 怎么封装可自行订制.

struct osd_rgb {
    int r;
    int g;
    int b;
};


struct osd_ycbcr {
    int y;
    int cb; 
    int cr; 
};



int osd_rgb_to_ycbcr(struct osd_ycbcr* ycbcr, const struct osd_rgb* rgb)
{
    int ret = 0;

    float y     = 0.257*(float)(rgb->r) + 0.504*(float)(rgb->g) + 0.098*(float)(rgb->b) + 16; 
    float cb    = -0.148*(float)(rgb->r) - 0.291*(float)(rgb->g) + 0.439*(float)(rgb->b) + 128;
    float cr    = 0.439*(float)(rgb->r) - 0.368*(float)(rgb->g) - 0.071*(float)(rgb->b) + 128;

    ycbcr->y    = y;
    ycbcr->cb   = cb; 
    ycbcr->cr   = cr; 

    return ret;
}


int osd_ycbcr_to_rgb(struct osd_rgb* rgb, const struct osd_ycbcr* ycbcr)
{
    int ret = 0;

    float r = 1.164*((float)(ycbcr->y)-16) + 1.596*((float)(ycbcr->cr)-128);
    float g = 1.164*((float)(ycbcr->y)-16) - 0.813*((float)(ycbcr->cr)-128) - 0.392*((float)(ycbcr->cb)-128);
    float b = 1.164*((float)(ycbcr->y)-16) + 2.017*((float)(ycbcr->cb)-128);

    rgb->r = r;
    rgb->g = g;
    rgb->b = b;

    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值