YUV文件的转换方法

简介: <p>YUV文件包括各种格式(如下图),有时需要它们之间的转换,下面提供2种方法。一种是采用集成软件的方法;第二种是采用C++源代码的方法,仅供参考。</p> <p><img src="http://img.blog.csdn.net/20150419202248472" alt=""><br></p> <p>第一种方法:集成软件的方法</p> <p>首先,在网址:<a target

YUV文件包括各种格式(如下图),有时需要它们之间的转换,下面提供2种方法。一种是采用集成软件的方法;第二种是采用C++源代码的方法,仅供参考。


第一种方法:集成软件的方法

首先,在网址:http://www.sunrayimage.com/ 下载YUVTools_3.0即可。

此软件的使用方法极为简单,在此不再赘述。

第二种方法:C++源代码

下面提供一个参考源码,可以根据自己需求进行修改。

#include <stdio.h>
#include <string.h>


#define		READ_WRITE_FILE_SIZE	176*144*2

unsigned char filebuf[38017] = {0};

int YUV422To420(unsigned char yuv422[], unsigned char yuv420[], int width, int height)
{        

       int ynum=width*height;
	   int i,j,k=0;
	   for(i=0;i<ynum;i++){
		   yuv420[i]=yuv422[i*2];
			//printf("%d\n",i);
	   }
	   for(i=0;i<height;i++){
		   if((i%2)!=0)continue;
		   for(j=0;j<(width/2);j++){
			   if((4*j+1)>(2*width))break;
			   yuv420[ynum+k*2*width/4+j]=yuv422[i*2*width+4*j+1];
			  printf("%d+%d*%d*%d/4+%d=%d\n",ynum,k,2,width,j,ynum+k*2*width/4+j);
		   }
		    k++;
	   }
	   k=0;
	   for(i=0;i<height;i++){
		   if((i%2)==0)continue;
		   for(j=0;j<(width/2);j++){
			   if((4*j+3)>(2*width))break;
			   yuv420[ynum+ynum/4+k*2*width/4+j]=yuv422[i*2*width+4*j+3];
			  printf("%d+%d+%d*%d*%d/4+%d=%d\n",ynum,ynum/4,k,2,width,j,ynum+ynum/4+k*2*width/4+j);
		   }
		    k++;
	   }
	   
	   
       return 1;
}

int main(void)
{
	int len = 0;
	FILE *fpr, *fpw;
	unsigned char buf[READ_WRITE_FILE_SIZE];
	fpr = fopen( "WEBCAM-00012.YUV", "rb" );
	fpw = fopen( "yuyv_2_yy_u_v.yuv", "wb" );
	if( fpr == NULL || fpw == NULL )
	{
		printf("can not read or write file\n");
		fcloseall();
		return 1;
	}
	fread( buf, READ_WRITE_FILE_SIZE, 1, fpr );
	if(YUV422To420(buf,filebuf,176,144))printf("ok\n");
	printf("size:%d",sizeof(filebuf));
	fwrite( &filebuf, sizeof(filebuf), 1, fpw );
	fcloseall();
	return 0;
}





目录
相关文章
|
API 索引 容器
qml之布局管理器(Qt Quick Layouts)
qml之布局管理器(Qt Quick Layouts)
956 2
|
Java
【java】修复:java: Error during the transformation of 'com.aicloud.data.util.ExcelUtils'; post-co...
【java】修复:java: Error during the transformation of 'com.aicloud.data.util.ExcelUtils'; post-co...
777 0
|
10月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
776 6
|
6月前
|
机器学习/深度学习 人工智能 数据可视化
构建AI智能体:七十三、模型的成绩单:一文读懂损失函数,看懂AI如何学习
本文系统介绍了损失函数在机器学习中的核心作用。首先通过类比教学场景,阐释损失函数作为模型"导师"的重要性。随后详细解析了回归任务中的均方误差(MSE)和平均绝对误差(MAE),通过房价预测案例展示了它们对误差的不同处理方式。在分类任务部分,重点讲解了二分类和多分类交叉熵损失函数,使用垃圾邮件识别和图像分类等实例,说明这些函数如何通过概率计算来评估预测准确性。文章通过可视化图表直观呈现了不同损失函数的特点,并强调损失函数作为模型优化的指南针,其设计直接影响学习效果。
679 20
|
8月前
|
Java API 开发工具
百宝箱开放平台 ✖️ Java SDK
百宝箱提供Java SDK,支持开发者集成其开放能力。需先发布应用,准备Java 8+及Maven环境,通过添加依赖安装SDK,并初始化客户端调用对话型或生成型智能体,实现会话管理、消息查询与文件上传等功能。
1668 0
百宝箱开放平台 ✖️ Java SDK
|
SQL 安全 Java
揭秘Spring Boot安全防线:如何巧妙抵御XSS与SQL注入的双重威胁?
【8月更文挑战第29天】随着互联网技术的发展,Web应用已成为社会不可或缺的一部分。Spring Boot作为高效构建Web应用的框架备受青睐,但同时也面临安全挑战,如XSS攻击和SQL注入。本文介绍如何在Spring Boot应用中防范这两种常见安全漏洞。针对XSS攻击,可通过输入验证、输出编码及使用安全API来加强防护;对于SQL注入,则应利用预编译语句、参数化查询及最小权限原则来确保数据库安全。示例代码展示了具体实现方法,帮助开发者提升应用安全性。
1403 2
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
9840 7
|
前端开发 JavaScript Android开发
移动端点击事件:原理、问题与解决方案
前端技术在移动端点击事件上的应用,涉及触屏交互、响应速度优化及用户体验提升,确保网页或应用在手机等移动设备上流畅运行。
|
数据库 Android开发
南大通用GBaseDataStudio 切换中文界面到英文界面
南大通用GBaseDataStudio 切换中文界面到英文界面
LXJ
|
安全 关系型数据库 Linux
PostgreSQL通过pg_upgrade进行大版本升级
PostgreSQL通过pg_upgrade进行大版本升级
LXJ
3750 0