YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
对于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相关推荐
- word转pdf图片模糊怎么办_嗨格式PDF转换器如何将PDF文件转换成Word?PDF转Word方法...
日常办公,我们有时候需要将PDF文件格式进行转换,鉴于PDF文件的特殊性,这就需要借助专业软件,例如嗨格式PDF转换器.嗨格式PDF转换器支持PDF.Word.Excel.PPT.图片等多种文件格式互 ...
- YUV格式学习:Y转换成RGB24
除了各种YUV格式转换成RGB外,还有一种是只转Y到RGB,如果YUV只有Y分量,也就就是YUV400这个格式了.如果成RGB后,显示出来的图像就是灰度图(因为Y是亮度),也可以理解为黑白图吧.下面给 ...
- YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
前面文章讲过题目中的YUYV.YVYU.UYVY.VYUY格式,它们都是YUV422的打包格式--即在内存中,Y.U.V都是挨着排序的.它们的名称就表示了Y.U.V的顺序.像YUYV,就是Y.U.Y. ...
- asp.net 将bmp格式图片怎么转换为jpg_PNG图片怎么转换成JPG?原来还可以这么转换...
PNG和JPG的区别是,对于需要高保真的较复杂的图像,PNG虽然能无损压缩,但PNG与JPG相比,PNG格式的文件容量比较大,不适合日常的传播流通.如果需要上传的图片的网页不支持PNG格式的图片上传, ...
- 为什么复制粘贴格式总是出错_想把图片转换成pdf格式怎么做?你找对方法了吗...
在工作中,总是会遇到各式各样的文件格式问题,例如昨天客户要的是PDF版本,我却做成了图片格式,现在只有把图片转换成PDF格式了,关键是几十张的长图,转换起来会不会很麻烦?其实只要找对了方法,就能很轻松 ...
- mysql 美东时间格式_C#/.NET怎么样将UTC时间转换成美国东部时间(EST)
C#/.NET将UTC时间转换成美国东部时间(EST)时,我们需要使用到.NET Framework中与时区有关的TimeZoneInfo类的静态方法:FindSystemTimeZoneById(& ...
- OFD格式的电子发票文件怎么免费转换成PDF
近年来OFD格式正在被越来越多的小伙伴所熟知,我们知道这是一种电子发票的格式,但是这种格式的文件需要特定的软件才能打开,为了方便阅览OFD文件中的内容,不少小伙伴想了很多办法,最终发现将OFD转为PD ...
- python处理时间格式时分秒_python将时分秒转换成秒的实例
处理数据的时候遇到一个问题,从数据库里导出的数据是时分秒的格式:hh:mm:ss ,现在我需要把它转换成秒,方便计算. 原数据可能分两种情况,字段有可能是文本字符串类型的,也有可能是时间类型,他们的处 ...
- SWF格式的视频如何快速无损地转换成MP4格式
SWF格式是一个动画文件,被广泛应用于网页设计.动画制作等领域.有时候我们需要将我们制作好的SWF格式动画转换成MP4格式的视频.那么该如何进行转换呢?其实很简单.下面小编便来分享我们平时转换的方法给 ...
最新文章
- jackson json转对象 对象转json
- gcc 无法编译问题解决
- sqlplus / as sysdba报错ORA-01031: insufficient privileges
- 怎么获取web项目的webroot根目录下面的文件夹的路径?
- 读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号
- python 去除读取txt输出时候的换行号
- [转载] 聚类算法总结
- hadoop hive集群_大数据专栏 | Hive 安装初体验
- Jquery实现城市选择(省市联动)
- python字典生成器_Python字典生成式、集合生成式、生成器用法实例分析
- Linux笔记7-系统管理
- 奔驰首秀L4自动驾驶:100万最贵电动车展示最豪华「AI代客泊车」
- Excel图表—超级好用的Bullet图(KPI考核图)
- Unity Shader-Ambient Occlusion环境光遮蔽(AO贴图,GPU AO贴图烘焙,SSAO,HBAO)
- 随机点名器1(Java数组基础)
- 3.堆栈指针寄存器 SP 详解
- Github标签管理
- Android默认短信应用常识
- VCS User Guide学习笔记【使用精简版】
- win10任务栏透明_Win10透明任务栏工具
热门文章
- 苹果高管:M1芯片iPad Air是为内容创作者和学生等设计
- 一加10 Pro首发定制X轴线性马达:Top级超大体积 安卓阵营马达天花板
- 微信公布10月朋友圈十大谣言 包括牙膏能杀灭幽门螺杆菌等
- SIA:全球半导体行业销售额7月达到454亿美元 创下月度纪录
- iQOO 8系列即将登场:首发三星E5 AMOLED全面屏
- 荣耀Magic3相机界面公布:提供专业“电影”功能
- 曝Redmi Note 9系列下周发布:最便宜的一亿像素手机
- 视频会议平台Zoom市值近1200亿美元,投资人李嘉诚赚翻了
- iPhone 6s不死!支持升级iOS 14,还能再战两年
- SpaceX载人龙飞船两名宇航员成功进入国际空间站