前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nv12转yuv420_百转

nv12转yuv420_百转

作者头像
全栈程序员站长
发布2022-11-08 16:22:07
8520
发布2022-11-08 16:22:07
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

YU12格式也叫I420格式,是YUV420p其中的一种,NV12是YUV420sp的一种。YU12和NV21中YUV数据的排列方式为: YU12:YYYYYYYY UU VV NV12:YYYYYYYY UV UV 针对数据的排列结构,本文将NV12转为YU12。

主要转换接口实现为:

int NV12toYU12(char *data, char *out, int width, int height);

功能描述 : Nv12格式转YU12 输入参数 : data : NV12图片数据指针 out :YU12图片地址 width: 图像宽度 height : 图像高度 输出参数 : out,YU12图片地址 返 回 值 : int类型

具体代码如下:

代码语言:javascript
复制
/* *********************************************************************** * 文件名称:Nv12toYU12.c * 文件描述:Nv12格式转YU12 * 作 者:Young Fan *日 期:2021-09-16 ************************************************************************ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/***************************************************************************** 函 数 名: NV12toYU12 功能描述 : Nv12格式转YU12 输入参数 : data NV12图片数据指针 out 输出的YU12图片地址 width 图像宽度 height 图像高度 输出参数 : 光栅格式yuv数据 返 回 值 : int *****************************************************************************/
int NV12toYU12(char *data, char *out, int width, int height)
{ 

if (data == NULL || out == NULL)
{ 

printf("error:empty pointer \n");
return -1;
}
if (width <= 0 || height <= 0)
{ 

printf("error:width or height is not positive \n");
return -1;
}
//分别获取NV12数据中的Y、U、V分量。NV12:YYYYYYYY UVUV => YU12: YYYYYYYY UU VV
//Y
memcpy(out, data, width * height);
printf("Y分量转换完成!\n");
//U
char * ptr1 = out + width * height; //YU12中U的首地址
char * ptr2 = data + width * height;
int n = 0;
while (n < width * height / 4)
{ 

//赋值
*(ptr1) = *(ptr2);
ptr1++;
ptr2 = ptr2 + 2;
n++;
}
printf("U分量转换完成!\n");
//V
ptr1 = out + width * height * 5 / 4; //YU12中V的首地址
ptr2 = data + width * height + 1;  
n = 0;
while (n < width * height / 4)
{ 

//赋值
*(ptr1) = *(ptr2);
ptr1++;
ptr2 = ptr2 + 2;
n++;
}
printf("V分量转换完成!\n");
return 0;
}
int main(void)
{ 
	
int width = 512;
int height = 288;
int size = width * height * 3 / 2; 
char *data = (char *)malloc(size);
char *out = (char *)malloc(size);
memset(data, 0, size);
memset(out, 0, size);
FILE *fp = fopen("./pic/NV12.yuv","rb");
fread(data, 1, size, fp);
int ret = NV12toYU12(data, out, width, height);
if (ret < 0)
{ 

printf("error: NV12toYU12 failed, ret %d\n", ret);
return -1;
}
//保存已转换好的YU12数据到本地
FILE *out_fp = fopen("./out_YU12.yuv", "wb");
fwrite(out, 1, size, out_fp);
printf("整体转换完成并将YU12图像保存在本地!\n");
//释放资源
fclose(fp);
fclose(out_fp);
if(data != NULL)
{ 

free(data);
data = NULL;
}
if(out != NULL)
{ 

free(out);
out = NULL;
}
return 0;
}

打印输出如下:

在这里插入图片描述
在这里插入图片描述

输出图片:

在这里插入图片描述
在这里插入图片描述

原图:

在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月24日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档