nv12转yuv420_百转

nv12转yuv420_百转YU12格式也叫I420格式,是YUV420p其中的一种,NV12是YUV420sp的一种。YU12和NV21中YUV数据的排列方式为:YU12:YYYYYYYYUUVVNV12:YYYYYYYYUVUV针对数据排列顺序结构,本文将NV12转为YU12。主要转换接口实现为:intNV12toYU12(char*data,char*out,intwidth,intheight);具体代码如下:/************************************

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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类型

具体代码如下:

/* *********************************************************************** * 文件名称: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;
}

打印输出如下:
在这里插入图片描述
输出图片:
在这里插入图片描述
原图:
在这里插入图片描述

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/189925.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SAXreader「建议收藏」

    SAXreader「建议收藏」packagecom.joyveb.addon.hp;importjava.io.StringReader;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.SAXReader;publicclassSni…

    2022年6月29日
    25
  • 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器第1章 引言        随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。通过数据切分来提高网站性能,横向扩展数据层已经成为架构研发人员首选的方式。水平切分数据库:可…

    2022年6月13日
    23
  • JS闭包的作用与优缺点[通俗易懂]

    JS闭包的作用与优缺点[通俗易懂]一、什么是闭包闭包是指一个函数和对其周围状态(lexicalenvironment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。简单来说就是指有权访问另一个函数作用域中变量的函数。举个例子:functionfn(){varnum=10;functionfun(){console.log(num);}fun();}fn();这就是一个闭…

    2025年6月20日
    5
  • todoMVC_mvc框架是什么

    todoMVC_mvc框架是什么依赖cssnpmitodomvc-commontodomvc-app-cssapp.component.tsimport{Component}from’@angular/core’;consttodos=[{id:1,title:’吃饭’,done:true},{id:1,title:’工作’,done:false},{id:1,title:’运动’,

    2025年10月28日
    2
  • python 内建模块_simulink常用模块

    python 内建模块_simulink常用模块Python常用内建模块datetime处理日期和时间的标准库。注意到datetime是模块,datetime模块还包含一个datetime类,通过fromdatetimeimportdatetime导入的才是datetime这个类。如果仅导入importdatetime,则必须引用全名datetime.datetime。datetime.now()返回当前日期和时间,其类型是…

    2025年7月10日
    3
  • WiFi安全漏洞KRACK深度解读

    WiFi安全漏洞KRACK深度解读前段时间爆出的WiFi安全漏洞KRACK,波及了全球的WLAN设备,无人幸免,也就是说wifi用户连接网络,不论是在公司,家里,还是咖啡馆,都有可能遭受攻击,问题时发现了一个,还有没有发现的,也许还更严重的问题,又该怎么办呢,如何规避协议层面的安全隐患,恐怕又是普通群众力所不及的。今天偶然看到一篇文章,文章对KRACK事件的技术缘由的进行了一番梳理剖析,纯技术系风格,看完后对此次爆出的安全漏洞有了

    2022年6月10日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号