雷霄骅在 https://blog.csdn.net/leixiaohua1020/article/details/40266503 一文中提到了yuv转rgb的代码,通过简单的改造,就可以直观的看出yuv的模样。

测试rgb的渲染。

改动CONVERT_YUV420PtoRGB24 的代码如下。

void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2); y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){R = 255;G = 0;B = 0;offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B;rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}

期待的结果为整个窗口为红色。

只渲染yuv中的y数据。

改动CONVERT_YUV420PtoRGB24 的代码如下。

void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2);y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){Y = *(y_planar + nWidth * i + j);R = Y;G = Y;B = Y;offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B;rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}

运行后的结果为:


可以看出,Y代表的就是亮度信息。

添加uv数据

改动CONVERT_YUV420PtoRGB24 的代码如下。值得注意的是,雷兄给的第一种方法,颜色有些许偏差,查资料可以看出来,第二种方法更加主流。https://stackoverflow.com/questions/1737726/how-to-perform-rgb-yuv-conversion-in-c-c

void CONVERT_YUV420PtoRGB24(unsigned char* yuv_src, unsigned char* rgb_dst, int nWidth, int nHeight)
{unsigned char Y, U, V, R, G, B;unsigned char* y_planar, * u_planar, * v_planar;int offSet = 0;int rgb_width = nWidth * 3;int ypSize = nWidth * nHeight;int upSize = (ypSize >> 2);int u_width = (nWidth >> 1);y_planar = yuv_src;u_planar = yuv_src + ypSize;v_planar = u_planar + upSize;for (int i = 0; i < nHeight; i++){for (int j = 0; j < nWidth; j++){Y = *(y_planar + nWidth * i + j);offSet = (i >> 1) * (u_width)+(j >> 1);U = *(v_planar + offSet);V = *(u_planar + offSet);int C, D, E;C = Y - 16;D = U - 128;E = V - 128;R = CONVERT_ADJUST((298 * C + 409 * E + 128) >> 8);G = CONVERT_ADJUST((298 * C - 100 * D - 208 * E + 128) >> 8);B = CONVERT_ADJUST((298 * C + 516 * D + 128) >> 8);offSet = rgb_width * i + j * 3;rgb_dst[offSet] = B; // 如果不想再调用CHANGE_ENDIAN_PIC,可以直接调换 b和r的赋值位置。rgb_dst[offSet + 1] = G;rgb_dst[offSet + 2] = R;}}
}

雷霄骅《最简单的视音频播放示例2:GDI播放YUV, RGB 》中YUV转RGB的过程相关推荐

  1. 雷霄骅开源视音频项目汇总

    from: http://blog.csdn.net/leixiaohua1020/article/details/42658139# 作者:雷霄骅, 一个值得怀念的人 本文汇总一下自己视音频编解码学 ...

  2. 最简单的视音频播放示例7:SDL2播放RGB/YUV

    最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例2:GDI播放YUV, RGB 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surfa ...

  3. 最简单的视音频播放示例9:SDL2播放PCM

    本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...

  4. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  5. 最简单的视音频播放示例8:DirectSound播放PCM

    ===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...

  6. 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)

    ===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...

  7. 最简单的视音频播放示例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...

  8. 最简单的视音频播放示例2:GDI播放YUV, RGB

    ===================================================== 最简单的视音频播放示例系列文章列表: 最简单的视音频播放示例1:总述 最简单的视音频播放示例 ...

  9. 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  10. 最简单的视音频播放示例3 Direct3D播放YUV,RGB(通过Surface)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! ==== ...

最新文章

  1. java 计时器归零_终止Java中的计时器
  2. nginx同IP、同端口、不同域名时的转发
  3. 【BZOJ2819】Nim 树状数组+LCA
  4. HDOJ 1428 漫步校园
  5. 实验报告:抽象数据类型的表现和实现
  6. 语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树
  7. spring mvc数据绑定与表单标签库
  8. 网格划分——Mesh操作
  9. 开源图像识别、imageai图像识别、对象识别、识别人、车、猫、狗等80种 简易版
  10. Cordova插件之跳转第三方app
  11. C# 原始的方法写入xml文件的代码
  12. 关于盒子背景图片布局
  13. linux中syscmd用法,M4 宏处理器
  14. 有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
  15. 让你高效工作的7大工具类网站
  16. Javaweb入门基础(尚硅谷,佟刚老师)笔记(一)
  17. web前端布局篇(切图)
  18. python将图片插入word文件的指定位置,并转为pdf文件
  19. 机器人测钢卷直径_机器人热轧钢卷喷号漆
  20. 如何计算cuboid的数量

热门文章

  1. 联想微型计算机c255r拆机,联想R9000P开箱拆机,送给你的618选购参考
  2. MAC上编写汇编程序
  3. C语言程序设计基础(02)—— Visual Studio Code 软件安装与使用
  4. 机器学习与模式识别期末试题回忆
  5. 浏览器兼容IE内核插件-IE TAB 安装
  6. 数据结构视频教程 -《[中山大学]算法与数据结构(C语言版)[胡青主讲]》
  7. 酱茄社区论坛圈子小程序pro更新与WordPress开源版小程序下载
  8. php kindeditor远程图片上传,kindeditor 远程图片本地化,远程图片下载到本地自动更换图片路径...
  9. logo计算机语言,LOGO语言
  10. 用C++实现Logo语言的基本命令。