YUV格式有很多种,按其采样方式,有444、422、420,还有411(但不常见)。针对数据的排序,又有平面格式和打包格式,还有“踢啊”特有的半平面格式——这些排列组合,就显得YUV格式多种多样,初看起来杂乱无章,但只要用心,就能理出头绪。像我,也是花了很多时间去慢慢搜索才真正理解。有时间会系统整理几篇文章出来,也会实践一下。

YUV444格式没有进行压缩,占用空间为with*height*3,与RGB占用空间相同。因此在转换上也很方便,但很多编码器似乎不太支持该格式。或许和其占用空间有莫大的关联吧。

首先给出生成查询表格的函数,代码是在网上找来的,如下:

#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endifstatic long U[256], V[256], Y1[256], Y2[256];void init_yuv422p_table(void)
{int i;static int init = 0;if (init == 1) return;// Initialize tablefor (i = 0; i < 256; i++){ V[i]  = 15938 * i - 2221300;U[i]  = 20238 * i - 2771300;Y1[i] = 11644 * i;Y2[i] = 19837 * i - 311710;}init = 1;
}

在转换成RGB之前,要调用上述函数。下面是YUV444转换成RGB24的函数实现:

void yuv4444_to_rgb24(unsigned char *yuv, unsigned char *rgb, int width, int height)
{int y, cb, cr;int r, g, b;int i = 0;unsigned char* p_y;unsigned char* p_u;unsigned char* p_v;unsigned char* p_rgb;p_y = yuv;p_u = yuv+width*height;p_v = yuv+2*width*height;p_rgb = rgb;init_yuv422p_table();for (i = 0; i < width * height; i++){y  = p_y[0];cb = p_u[0];cr = p_v[0];//yuv2rgb(y, cb, cr, &r, &g, &b);//yuv2rgb_1(y, cb, cr, &r, &g, &b);r = MAX (0, MIN (255, (V[cr] + Y1[y])/10000));   //R valueb = MAX (0, MIN (255, (U[cb] + Y1[y])/10000));   //B valueg = MAX (0, MIN (255, (Y2[y] - 5094*(r) - 1942*(b))/10000)); //G valuep_rgb[0] = r;p_rgb[1] = g;p_rgb[2] = b;;p_rgb += 3;p_y++;p_u++;p_v++;}
}

从代码看到,实际上就是扫描YUV444的内存,得到Y、U、V的分量,然后查表得到对应用R、G、B值,再赋值给RGB内存指针。如前所述,YUV444与RGB占用空间相同,故在代码并无太多的技巧。

李迟 2015.8.5 晚上



YUV格式学习:YUV444转换RGB24相关推荐

  1. YUV格式学习:Y转换成RGB24

    除了各种YUV格式转换成RGB外,还有一种是只转Y到RGB,如果YUV只有Y分量,也就就是YUV400这个格式了.如果成RGB后,显示出来的图像就是灰度图(因为Y是亮度),也可以理解为黑白图吧.下面给 ...

  2. YUV格式介绍与转换

    YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...

  3. 视频编解码学习(六):YUV格式学习

    1.YUV格式详解 参考文章 : http://blog.csdn.NET/linweig/article/details/5515928 http://www.cnblogs.com/azraell ...

  4. YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24

    对于YUV422的格式,网上有一大堆资料,这里就不说了.直奔主题,给出如何转换的函数,一如既往,只用代码说事. YUV422有打包格式(Packed),一如前文所述.同时还有平面格式(Planar), ...

  5. YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24

    YUV420有打包格式(Packed),一如前文所述.同时还有平面格式(Planar),即Y.U.V是分开存储的,每个分量占一块地方,其中Y为width*height,而U.V合占Y的一半,该种格式每 ...

  6. YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24

    前面文章讲过题目中的YUYV.YVYU.UYVY.VYUY格式,它们都是YUV422的打包格式--即在内存中,Y.U.V都是挨着排序的.它们的名称就表示了Y.U.V的顺序.像YUYV,就是Y.U.Y. ...

  7. YUV格式学习:NV12和YUV420P格式互换

    NV12和YUV420的转换是在相同采样空间的转换,只是个别分量位置的调整,只要明白了Y.U.V分量的布置,就很容易写出来. 代码如下: /** yyyy yyyy uv uv -> yyyy ...

  8. YUV格式学习:NV16和YUV422P格式互换

    其实以前也实现过SP转P的格式,现在再完善一些,写成此文.由于是相同采样空间的转换,只是个别分量位置的调整,只要明白了Y.U.V分量的布置,就很容易写出来. 代码如下: /** yyyy yyyy u ...

  9. java rgb yuv_RGB和YUV简单学习记录

    RGB和YUV是一种颜色编码格式. 这里简单介绍一下RGB.YUV和HSV. 出处:一文读懂 YUV 的采样与格式 https://glumes.com/post/ffmpeg/understand- ...

最新文章

  1. QT+OpenCV照片动画风格转换
  2. 疫情下的情人节怎么过?Serverless在线课堂来支招
  3. git 清除 另一个git进程似乎在这个仓库中运行。。。。。
  4. Java并发– CyclicBarrier示例
  5. 深圳警方出手!“钱爸爸”涉嫌集资诈骗 已累计冻结2.13亿元
  6. 怎么清除远程计算机的用户名,Windows8系统如何清除“远程桌面连接”登录历史痕迹...
  7. Oracle跨数据库操作
  8. hdoj--5620--KK's Steel(斐波那契数)
  9. c语言的常用英语单词和翻译,c语言通用英语词汇带翻译
  10. the system clock has been set more than 24 hours
  11. 学校创客教育实施方案
  12. 水仙花案例与嵌套循环案例
  13. 在线引流工具Tcpcopy原理、使用、采坑
  14. 古典风格园林景观织梦cms模板
  15. LeetCode题解(0863):寻找二叉树中距离指定节点的距离为K的结点(Python)
  16. iOS 项目开发总览,开发者账号
  17. db2离线备份_DB2离线全备份与在线备份.pdf
  18. SRE学习笔记2:衡量系统稳定性的指标
  19. Word 中如何标记修订?如何去掉修订标记只显示最终状态?
  20. C++原创飞机大战代码

热门文章

  1. 扫地机器人开机充电还是关机充电器_新手机是开机充电好,还是关机充电好,老司机告诉你...
  2. 买房子还是不买房子,这是一个问题
  3. eZ publish 3 安装指南
  4. iPhone 13 Pro系列最新渲染图曝光:小刘海+大尺寸后置相机模组
  5. 10月份全球最畅销电动汽车:Model 3第一 五菱宏光MiniEV第二
  6. 王腾疑似喜提Redmi Note10系列新机:最高搭载1亿像素主摄
  7. 乐视网1354项商标1.3亿元成交,接盘的是这家公司
  8. 腾讯之后,网易跟上了:未成年人每日限玩1.5小时游戏
  9. 微信一年“扫码”约占我国GDP 9%,带动近三千万个就业机会
  10. iPhone 9上架了?5月1日发货?