前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YUV转RGB暴力解码

YUV转RGB暴力解码

作者头像
Qt君
发布2020-03-05 14:53:22
1.9K0
发布2020-03-05 14:53:22
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

❝以空间换取时间,高速转换YUV到RGB。 ❞

常用的YUV转RGB做法

  此方法非常简单,但设计到浮点运算,效率会很差。

代码语言:javascript
复制
r = y + (1.370705 * (u-128));
g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
b = y + (1.732446 * (u-128));

高效做法

  通过数组下标的取值达到高速转换YUV,运行损耗基本可以忽略。

代码语言:javascript
复制
uint32_t YUV2RGB(uint8_t y, uint8_t u, uint8_t v)
{
    uint32_t RGB = 0;
    uint8_t *r = (uint8_t *)&RGB + 0;
    uint8_t *g = (uint8_t *)&RGB + 1;
    uint8_t *b = (uint8_t *)&RGB + 2;

    /* 只初始化一次,用于初始化YUV转RGB对照表 */
    static bool isInitialized = initYUV2RGB();

    *r = s_R[y][v];    /* R */
    *g = s_G[y][u][v]; /* G */
    *b = s_B[y][u];    /* B */

    return RGB;
}

原理

  由于YUV和RGB取值范围都落在0-255,所以我们通过遍历所有的YUV的取值可能性即可得出RGB的取值:

  • 计算r值只需要y和u分别遍历0-255种可能性即可,共有256*256种可能性(y*u)。
代码语言:javascript
复制
r = y + (1.370705 * (u-128));
  • 而g值有256*256*256种可能性(y*v*u)。
代码语言:javascript
复制
g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
  • b值有256*256种可能性(y*u)。
代码语言:javascript
复制
b = y + (1.732446 * (u-128));

  最后用数组保存起来盘它。

代码语言:javascript
复制
static uint8_t s_R[256][256] = {0};
static uint8_t s_G[256][256][256] = {0};
static uint8_t s_B[256][256] = {0};

/* 初始化YUV转RGB转换对照表 */
static bool initYUV2RGB()
{
    for (int i = 0; i < 256; i++) {
        for (int j = 0; j < 256; j++) {
            int r = i + (1.370705 * (j-128));
            s_R[i][i] = r < 0 ? 0 : r;
            s_R[i][j] = r > 255 ? 255 : r;

            int b = i + (1.732446 * (i-128));
            s_B[i][i] = b < 0 ? 0 : b;
            s_B[i][j] = b > 255 ? 255 : b;

            for (int k = 0; k < 256; k++) {
                int g = i - (0.698001 * (k-128)) - (0.337633 * (j-128));
                s_G[i][i][k] = g < 0 ? 0 : g;
                s_G[i][j][k] = g > 255 ? 255 : g;
            }
        }
    }

    return true;
}

关于更多

  • 源码地址:https://github.com/aeagean/YUV2RGB
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用的YUV转RGB做法
  • 高效做法
  • 原理
  • 关于更多
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档