yuv420 转换成 bmp
源码如下:
// ConsoleApplication1.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h> 
#define XSIZE 1920
#define YSIZE 1080     
#define RGB_SIZE  XSIZE * YSIZE * 3
typedef unsigned char byte;
double YUV2RGB_CONVERT_MATRIX[3][3] = { { 1, 0, 1.4022 }, { 1, -0.3456, -0.7145 }, { 1, 1.771, 0 } };
void ConvertYUV2RGB(unsigned char *yuvFrame, unsigned char *rgbFrame, int width, int height)
{
	int uIndex = width * height;
	int vIndex = uIndex + ((width * height) >> 2);
	int gIndex = width * height;
	int bIndex = gIndex * 2;
	int temp, x, y;
	for (y = 0; y < height; y++)
	{
		for (x = 0; x < width; x++)
		{
			// R分量
			temp = (int)(yuvFrame[y * width + x] + (yuvFrame[vIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[0][2]);
			rgbFrame[y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
			// G分量
			temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[1][1] + (yuvFrame[vIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[1][2]);
			rgbFrame[gIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
			// B分量
			temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y / 2) * (width / 2) + x / 2] - 128) * YUV2RGB_CONVERT_MATRIX[2][1]);
			rgbFrame[bIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
		}
	}
}
int  main(){
	int i, j, y, x;
	long width, height;
	unsigned char *data;
	unsigned char *image;   //用于存放读取的yuv数据
	unsigned char *image_bmp;
	FILE *fp_r;
	width = XSIZE;
	height = YSIZE;
	long int bytePerLine = width * 3;
	//申请空间
	image = (unsigned char *)malloc(width * height * 3 / 2);
	image_bmp = (unsigned char *)malloc(width * height * 3);
	data = (unsigned char*)malloc(bytePerLine * height);
	if ((NULL == image) || (image_bmp == NULL) || (data == NULL))
	{
		printf("faied to malloc the image\n");
		return -1;
	}
	/********读取yuv 文件***********/
	fp_r = fopen("test.yuv", "rb"); //打开yuv 文件
	if (NULL == fp_r)
	{
		printf("failed to open the fp_r\n");
		return -1;
	}
	fread(image, sizeof(unsigned char), XSIZE * YSIZE * 3 / 2, fp_r);
	fclose(fp_r);
	for (i = 0; i<width *height * 3; i++)
		*(image_bmp + i) = 255;
	//写bmp图片
	int gIndex = width * height;
	int bIndex = gIndex * 2;
	unsigned char header[54] = {
		0x42, 0x4d,       //WORD  bfType----------- [0,1]
		0, 0, 0, 0,      //DWORD bfSize----------- [2,3,4,5]
		0, 0,            //WORD  bfReserved1------ [6,7]
		0, 0,            //WORD  bfReserved2------ [8,9]
		54, 0, 0, 0,      //WORD  bfOffBits-------- [10,11,12,13]   
		40, 0, 0, 0,      //DWORD biSize----------- [14,15,16,17]
		0, 0, 0, 0,      //LONG  biWidth---------- [18,19,20,21]
		0, 0, 0, 0,      //LONG  biHeight--------- [22,23,24,25]
		1, 0,            //WORD  biplanes--------- [26,27]
		24, 0,            //WORD  biCount---------- [28,29]
		0, 0, 0, 0,      //DWORD biCompression---- [30,31,32,33]
		0, 0, 0, 0,      //DWORD biSizeImage------ [34,35,36,37]
		0, 0, 0, 0,      //LONG  biXPelsPerMeter-- [38,39,40,41]
		0, 0, 0, 0,      //LONG  biYPelsPerMeter-- [42,43,44,45]
		0, 0, 0, 0,      //DWORD biClrUsed-------- [46,47,48,49]
		0, 0, 0, 0       //DWORD biClrImportant--- [50,51,52,53]
	};
	long file_size = (long)width * (long)height * 3 + 54;
	header[2] = (unsigned char)(file_size & 0x000000ff);
	header[3] = (file_size >> 8) & 0x000000ff;
	header[4] = (file_size >> 16) & 0x000000ff;
	header[5] = (file_size >> 24) & 0x000000ff;
	header[18] = width & 0x000000ff;
	header[19] = (width >> 8) & 0x000000ff;
	header[20] = (width >> 16) & 0x000000ff;
	header[21] = (width >> 24) & 0x000000ff;
	header[22] = height & 0x000000ff;
	header[23] = (height >> 8) & 0x000000ff;
	header[24] = (height >> 16) & 0x000000ff;
	header[25] = (height >> 24) & 0x000000ff;
	char filename[6] = "1.bmp";
	ConvertYUV2RGB(image, image_bmp, width, height);
	for (y = height - 1, j = 0; y >= 0; y--, j++)
	{
		for (x = 0, i = 0; x < width; x++)
		{
			data[y * bytePerLine + i++] = image_bmp[bIndex + j * width + x];
			// B                    
			data[y * bytePerLine + i++] = image_bmp[gIndex + j * width + x];
			// G          
			data[y * bytePerLine + i++] = image_bmp[j * width + x];
			// R
		}
	}
	//sprintf(filename, "%d.bmp",1);   
	FILE *fp_w;
	if (!(fp_w = fopen(filename, "wb")))
		return -1;
	fwrite(header, sizeof(unsigned char), 54, fp_w);
	fwrite(data, sizeof(unsigned char), XSIZE * YSIZE * 3, fp_w);
	fclose(fp_w);
	free(image);
	return(0);
}
												
											yuv420 转换成 bmp的更多相关文章
- 音视频入门-03-RGB转成BMP图片
		
* 音视频入门文章目录 * BMP 文件格式解析 BMP 文件由文件头.位图信息头.颜色信息和图形数据四部分组成. 位图文件头(14个字节) 位图信息头(40个字节) 颜色信息 图形数据 文件头与信息 ...
 - 通过FFmpeg将多媒体文件解码后保存成Bmp图像(YUV420 RGB32)
		
/* g++ -o test test.cpp -lavformat -lavcodec -lavutil -lz -lm -lpthread -lswscale */ #include <st ...
 - 实现同时将一批.bmp文件转换成.mat格式
		
%% 功能:实现同时对一批.bmp文件的转换成.mat格式PicFormat = {'*.bmp','Bitmap image (*.bmp)';... '*.jpg','JPEG image (*. ...
 - 15个最好的PDF转word的在线转换器,将PDF文件转换成doc文件
		
PDF是一种文件格式,包含文本,图像,数据等,这是独立于操作系统的文件类型.它是一个开放的标准,压缩,另一方面DOC文件和矢量图形是由微软文字处理文件.该文件格式将纯文本格式转换为格式化文档.它支持几 ...
 - webp怎么打开 webp怎么转换成jpg
		
webp怎么打开 webp怎么转换成jpg 2 3 4 5 6 7 分步阅读 在使用google服务的时候(比如 google play),我们会发现保存的图都是webp格式. 那webp是什么东 ...
 - Android网络图片转换成bitmap保存到本地指定文件夹
		
下列代码,请求网络图片转换为bitmap,然后保存到指定文件夹,微信,QQ分享,要求缩略图不大于32kb 压缩图片代码,使用了Glide来进行图片压缩处理 Glide.get(ShopDetailsA ...
 - data:image/png;base64   上传图像将图片转换成base64格式
		
大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJ ...
 - delphi将图片转换成Base64编码函数
		
{************************************************************************** 名称: BaseImage 参数: fn: TF ...
 - android将drawable下的图片转换成bitmap
		
将drawable下的图片转换成bitmap 1. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.xx ...
 
随机推荐
- MySQL实战45讲学习笔记:第十六讲
			
一.今日内容概要 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 ...
 - [LeetCode] 321. Create Maximum Number 创建最大数
			
Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum numb ...
 - 2,[VS入门教程] 使用Visual Studio写c语言  入门与技巧精品文~~~~优化篇
			
本文导航: 关闭界面特效以提高流畅度 解决调试时出现"无法查找或打开PDB文件"的符号问题 注册微软账号并在vs登录 使用Visual Studio Team Services,同 ...
 - ORA-01722 invalid number 一个比较隐蔽的可能错误原因
			
在Oracle数据库中,数据类型为char或者varchar的字段,里面存储的数据,可以是纯数字串,比如: 3433,也可以是带有英文字符的字符串,比如: 3433a. Oracle对于纯数字串, ...
 - OPTIONS预检请求
			
OPTIONS预检请求 背景:像后台发送一个post请求,出错,错误代码403(权限验证未通过),查看请求方法变成OPTIONS.检查请求头得知,当前请求token未带上,问题,为什么post请求变成 ...
 - ES6高级技巧(五)
			
Set 由于Set结构没有键名,只有键值所有keys方法和values方法的行为完全一致 let a=new Set([1,2,3,4]) //a.keys() a.values() 或者直接用of遍 ...
 - CDR镂空字踩坑记录
			
做个成品,看似没毛病 坑1 但是对整体上个色就会发现,白框部分一片漆黑(字黑色,框子黑色) 然后根据大牛的作品染色后没毛病推出 ==> 字体要做镂空字 坑1解决 先把框内元素全部选择(字.矢量图 ...
 - java设计模式单例模式
			
创建型模式: – 单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式. • 结构型模式: – 适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模 式. • 行为型模式: – 模版 ...
 - digital clock based C
			
/********************************** * Name : timeDisplay.cpp * Purpose: Display digital clock accord ...
 - IDEA 部署spring Cloud
			
Spring cloud Eureka Eureka Server,注册中心 Eureka Client,所有要进行注册的微服务通过Eureka Client 连接到 Eureka Server ,完 ...