19,468
社区成员
发帖
与我相关
我的任务
分享
//生成图片的代码,图片是129*129
void CBmp_aviDlg::ImageShow(unsigned char *data, int Width, int Height, CString PathName)
{
if (!data)
{
return ;
}
unsigned char *Mydata;
//颜色表,设定为灰度图像
int colorTablesize=1024;
int widthStep=(Width+3)/4*4;
//将数据重新排列成符合bmp规则的方式
Mydata=new unsigned char[widthStep*Height];
for (int i=0;i<Height;i++)
{
for (int j=0;j<Width;j++)
{
*(Mydata+i*widthStep+j)=*(data+i*Width+j);
}
}
RGBQUAD pColorTable[256];
//open a file to write bmp data
FILE *fp=fopen(PathName,"wb");
if (0==fp)
{
return;
}
//申请位图文件头信息,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType=0x4D42;
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize
+widthStep*Height;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
//bfoffBits the begin 3 parts
fileHead.bfOffBits=54+colorTablesize;
//write into file head
fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp);
//申请位图信息头结构信息,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount=8;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=Height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=widthStep*Height;
head.biWidth=Width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息进内存
fwrite(&head,sizeof(BITMAPINFOHEADER),1,fp);
//构建颜色表,并写入
for (i=0; i<256; i++)
{
pColorTable[i].rgbBlue=i;
pColorTable[i].rgbGreen=i;
pColorTable[i].rgbRed=i;
pColorTable[i].rgbReserved=0;
}
fwrite(pColorTable,sizeof(RGBQUAD),256,fp);
//write the data in file
fwrite(Mydata,Height*widthStep,1,fp);
fclose(fp);
delete [] Mydata;
return;
}
//生成avi的代码,图片读取的路径已经设定好
//这段在测试时是可以成功运行的(用的从一个视频中截取的bmp图片),但是读由上面代码产生的图片却不行
bool CBmp_aviDlg::bmp_avi(CString aviName, CString bmpPath)
{
CFileFind finder;
//路径名
//若调试中不能打开图片,在路径前面加上"."表示当前文件夹
AVIFileInit();
PAVIFILE pfile;
PAVISTREAM ps;
BITMAPFILEHEADER bmpFileHdr;
DWORD dwSize ;
LPBITMAPINFOHEADER pDib;
HANDLE hdib;
//压缩格式: 未压缩
AVICOMPRESSOPTIONS strcm;
strcm.cbFormat=0;
strcm.cbParms=0;
strcm.cbFormat=0;
strcm.cbParms=0;
strcm.dwBytesPerSecond=0;
strcm.dwFlags=8;
strcm.dwInterleaveEvery=0;
strcm.dwKeyFrameEvery=0;
strcm.dwQuality=0;
strcm.fccHandler=COMPRESS_NOCOMPRESS;
strcm.fccType=mmioFOURCC('V','I','D','C');
strcm.lpFormat=NULL;
strcm.lpParms=NULL;
int nFrames =0; //frame number
HRESULT hr;
//判断是否存在路径
BOOL bFind = finder.FindFile(bmpPath);
if (!bFind)
{
AfxMessageBox("don't exist bmp file");
return false;
}
while(bFind)
{
bFind = finder.FindNextFile();//判断是否文件夹为空
if(!finder.IsDots() && !finder.IsDirectory())//判断找到的文件不是当前目录or父目录
{
CString str = finder.GetFilePath();
CFile bmpfile;
// 打开文件
if(bmpfile.Open(str,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
return false;
bmpfile.Read(&bmpFileHdr,sizeof(BITMAPFILEHEADER));
dwSize=bmpFileHdr.bfSize-sizeof(BITMAPFILEHEADER);
hdib=GlobalAlloc(GHND,dwSize);//分配内存
pDib=(LPBITMAPINFOHEADER)GlobalLock(hdib);
bmpfile.Read(pDib,dwSize);
if(nFrames ==0 )
{
AVISTREAMINFO strhdr;
//将要写入AVI文件的名字,不存在的就创建一个
AVIFileOpen(&pfile,aviName , OF_WRITE | OF_CREATE , NULL);
_fmemset(&strhdr, 0, sizeof(strhdr));//Sets buffers to a specified character
//the function is similar to initial.
strhdr.fccType = streamtypeVIDEO;// stream type
strhdr.fccHandler = 0;
strhdr.dwScale = 1;
strhdr.dwRate = 20; // 15 fps
strhdr.dwSuggestedBufferSize = pDib->biSizeImage ;
SetRect(&strhdr.rcFrame, 0, 0, pDib->biWidth, pDib->biHeight);
// And create the stream;
hr = AVIFileCreateStream(pfile,&ps,&strhdr);
hr = AVIStreamSetFormat(ps,0,pDib,
pDib->biSize+pDib->biClrUsed*sizeof(RGBQUAD));
}
hr = AVIStreamWrite(ps, nFrames , 1,
(LPBYTE)pDib+pDib->biSize+pDib->biClrUsed*sizeof(RGBQUAD),
pDib->biSizeImage,
AVIIF_KEYFRAME,
NULL,
NULL);
GlobalFreePtr(pDib);
nFrames ++;
}
}
AVIStreamClose(ps);
if(pfile != NULL)
AVIFileRelease(pfile);
AVIFileExit();
return true;
}