读取YU12文件中的Y分量内容,并一桢一桢的保存下来

#include "stdafx.h"
#include <iostream>
#include "Lvector.h"
#include <vector>
#include <stdio.h>
#include <assert.h>
#include "cv.h"
#include "highgui.h"
// #include <afx.h>
using namespace std;

//YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)

int main()
{
	FILE *fp = fopen("aa.yv12","rb");
	unsigned char * pBuffer = new unsigned char [704*576];
	int len = 0;
	int i = 0;
	
	IplImage *pIplImage=cvCreateImage(cvSize(704,576),IPL_DEPTH_8U,1); //创建但通道的位深为8位的IplImage格式的图象
	
	while (true)
	{
		len = fread(pBuffer,1,704*576,fp);//读取一桢Y分量的大小
		
		if(pIplImage)
		{ 
			i++;
			memcpy(pIplImage->imageData,pBuffer,704*576);//pYData,nYSize
			char path[128] = {0};
			
			sprintf(path,"%d_.jpg",i);  
			
			cvSaveImage(path,pIplImage);
		}
		if (len == 0)
		{
			break;
		}
		fread(pBuffer,1,704*576/4,fp);//读取一桢U分量的大小,加这两句,就是为了把U、V分量去掉
		fread(pBuffer,1,704*576/4,fp);//读取一桢V分量的大小

	}
	cvReleaseImage(&pIplImage);
	fclose(fp);
}

 

函数原型

size_t fread ( void   * buffer ,  size_t size ,  size_t count ,  FILE * stream ) ;

功 能

从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。

参 数

buffer
用于接收 数据的 内存地址,大小至少是 size* count字节.
size
单个元素的大小,单位是 字节
count
元素的个数,每个元素是size字节.
stream
输入流

返回值

实际读取的元素个数.如果返回值与 count不相同,则可能文件结尾或发生错误.
从ferror和feof获取错误信息或检测是否到达文件结尾.

memcpy

函数原型

void *memcpy(void *dest, const void *src, size_t n);

功能

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

 

你可能感兴趣的:(读取YU12文件中的Y分量内容,并一桢一桢的保存下来)