对于YUV422的格式,网上有一大堆资料,这里就不说了。直奔主题,给出如何转换的函数,一如既往,只用代码说事。

YUV422有打包格式(Packed),一如前文所述。同时还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,其中Y为width*height,而U、V合占width*height,该种格式每个像素占16比特。根据U、V的顺序,分出2种格式,U前V后即YUV422P,也叫I422,V前U后,叫YV16(YV表示Y后面跟着V,16表示16bit)。另外,还有一种变态的半平面格式(Semi-planar),即Y单独占一块地方,但其后U、V又紧挨着排在一起,根据U、V的顺序,又有2种,U前V后叫NV16,在国内好像很多人叫它为YUV422SP格式;V前U后叫NV61。不过这种格式似乎不太受VLC欢迎(具体可去看看VLC的wiki)。

先给出YUV422平面格式的转换函数,如下:

/**
内存分布w+--------------------+|Y0Y1Y2Y3...         ||...                 |   h|...                 ||                    |+--------------------+|U0U1      ||...       |   h|...       ||          |+----------+|V0V1      ||...       |  h|...       ||          |+----------+w/2
*/
void yuv422p_to_rgb24(YUV_TYPE type, unsigned char* yuv422p, 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 = yuv422p;p_u = p_y + width * height;p_v = p_u + width * height / 2;if (type == FMT_YV16){p_v = p_y + width * height;p_u = p_u + width * height / 2;}p_rgb = rgb;init_yuv422p_table();for (i = 0; i < width * height / 2; i++){y  = p_y[0];cb = p_u[0];cr = p_v[0];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 value// 此处可调整RGB排序,BMP图片排序为BGR// 默认排序为:RGBp_rgb[0] = r;p_rgb[1] = g;p_rgb[2] = b;y  = p_y[1];cb = p_u[0];cr = p_v[0];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[3] = r;p_rgb[4] = g;p_rgb[5] = b;p_y += 2;p_u += 1;p_v += 1;p_rgb += 6;}
}

接着给出NV16、NV61转换成RGB的函数,如下:

/**
内存分布w+--------------------+|Y0Y1Y2Y3...         ||...                 |   h|...                 ||                    |+--------------------+|U0V0U1V1            ||...                 |   h|...                 ||                    |+--------------------+w/2
UV交织为NV16,VU交织为NV61
可以与上一函数合并,但方便查看,还是不合并
*/
void yuv422sp_to_rgb24(YUV_TYPE type, unsigned char* yuv422sp, 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_uv;unsigned char* p_rgb;p_y = yuv422sp;p_uv = p_y + width * height;    // uv分量在Y后面p_rgb = rgb;init_yuv422p_table();for (i = 0; i < width * height / 2; i++){y  = p_y[0];if (type ==  FMT_NV16){cb = p_uv[0];cr = p_uv[1];    // v紧跟u,在u的下一个位置}if (type == FMT_NV61){cr = p_uv[0];cb = p_uv[1];    // u紧跟v,在v的下一个位置}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 value// 此处可调整RGB排序,BMP图片排序为BGR// 默认排序为:RGBp_rgb[0] = r;p_rgb[1] = g;p_rgb[2] = b;y  = p_y[1];if (type ==  FMT_NV16){cb = p_uv[0];cr = p_uv[1];}if (type ==  FMT_NV61){cr = p_uv[0];cb = p_uv[1];}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[3] = r;p_rgb[4] = g;p_rgb[5] = b;p_y += 2;p_uv += 2;p_rgb += 6;}
}

参考资料:

http://www.fourcc.org/yuv.php

https://wiki.videolan.org/YUV/

李迟 2015.8.5 晚上




YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24相关推荐

  1. word转pdf图片模糊怎么办_嗨格式PDF转换器如何将PDF文件转换成Word?PDF转Word方法...

    日常办公,我们有时候需要将PDF文件格式进行转换,鉴于PDF文件的特殊性,这就需要借助专业软件,例如嗨格式PDF转换器.嗨格式PDF转换器支持PDF.Word.Excel.PPT.图片等多种文件格式互 ...

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

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

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

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

  4. asp.net 将bmp格式图片怎么转换为jpg_PNG图片怎么转换成JPG?原来还可以这么转换...

    PNG和JPG的区别是,对于需要高保真的较复杂的图像,PNG虽然能无损压缩,但PNG与JPG相比,PNG格式的文件容量比较大,不适合日常的传播流通.如果需要上传的图片的网页不支持PNG格式的图片上传, ...

  5. 为什么复制粘贴格式总是出错_想把图片转换成pdf格式怎么做?你找对方法了吗...

    在工作中,总是会遇到各式各样的文件格式问题,例如昨天客户要的是PDF版本,我却做成了图片格式,现在只有把图片转换成PDF格式了,关键是几十张的长图,转换起来会不会很麻烦?其实只要找对了方法,就能很轻松 ...

  6. mysql 美东时间格式_C#/.NET怎么样将UTC时间转换成美国东部时间(EST)

    C#/.NET将UTC时间转换成美国东部时间(EST)时,我们需要使用到.NET Framework中与时区有关的TimeZoneInfo类的静态方法:FindSystemTimeZoneById(& ...

  7. OFD格式的电子发票文件怎么免费转换成PDF

    近年来OFD格式正在被越来越多的小伙伴所熟知,我们知道这是一种电子发票的格式,但是这种格式的文件需要特定的软件才能打开,为了方便阅览OFD文件中的内容,不少小伙伴想了很多办法,最终发现将OFD转为PD ...

  8. python处理时间格式时分秒_python将时分秒转换成秒的实例

    处理数据的时候遇到一个问题,从数据库里导出的数据是时分秒的格式:hh:mm:ss ,现在我需要把它转换成秒,方便计算. 原数据可能分两种情况,字段有可能是文本字符串类型的,也有可能是时间类型,他们的处 ...

  9. SWF格式的视频如何快速无损地转换成MP4格式

    SWF格式是一个动画文件,被广泛应用于网页设计.动画制作等领域.有时候我们需要将我们制作好的SWF格式动画转换成MP4格式的视频.那么该如何进行转换呢?其实很简单.下面小编便来分享我们平时转换的方法给 ...

最新文章

  1. jackson json转对象 对象转json
  2. gcc 无法编译问题解决
  3. sqlplus / as sysdba报错ORA-01031: insufficient privileges
  4. 怎么获取web项目的webroot根目录下面的文件夹的路径?
  5. 读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号
  6. python 去除读取txt输出时候的换行号
  7. [转载] 聚类算法总结
  8. hadoop hive集群_大数据专栏 | Hive 安装初体验
  9. Jquery实现城市选择(省市联动)
  10. python字典生成器_Python字典生成式、集合生成式、生成器用法实例分析
  11. Linux笔记7-系统管理
  12. 奔驰首秀L4自动驾驶:100万最贵电动车展示最豪华「AI代客泊车」
  13. Excel图表—超级好用的Bullet图(KPI考核图)
  14. Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
  15. 随机点名器1(Java数组基础)
  16. 3.堆栈指针寄存器 SP 详解
  17. Github标签管理
  18. Android默认短信应用常识
  19. VCS User Guide学习笔记【使用精简版】
  20. win10任务栏透明_Win10透明任务栏工具

热门文章

  1. 苹果高管:M1芯片iPad Air是为内容创作者和学生等设计
  2. 一加10 Pro首发定制X轴线性马达:Top级超大体积 安卓阵营马达天花板
  3. 微信公布10月朋友圈十大谣言 包括牙膏能杀灭幽门螺杆菌等
  4. SIA:全球半导体行业销售额7月达到454亿美元 创下月度纪录
  5. iQOO 8系列即将登场:首发三星E5 AMOLED全面屏
  6. 荣耀Magic3相机界面公布:提供专业“电影”功能
  7. 曝Redmi Note 9系列下周发布:最便宜的一亿像素手机
  8. 视频会议平台Zoom市值近1200亿美元,投资人李嘉诚赚翻了
  9. iPhone 6s不死!支持升级iOS 14,还能再战两年
  10. SpaceX载人龙飞船两名宇航员成功进入国际空间站