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;
}
微信扫码订阅
UP更新不错过~
关注
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Freeze_Z

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值