一段将多张图片生成AVI视频的C++源码
2022/1/5 11:04:09
本文主要是介绍一段将多张图片生成AVI视频的C++源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
将做工程过程较好的代码段备份一下,下面的代码段是关于一段将多张图片生成AVI视频的C++的代码,应该能对各朋友有一些帮助。
#pragma once
#include <vfw.h>
#pragma comment(lib,“Vfw32.lib”)
class ImageToAVI : public base::_class{
protected:
PAVIFILE _file;
PAVISTREAM _aviStream,
_aviCompressed;
int _frames,_delay;
void _initMember(); bool _initStream(LPBITMAPINFOHEADER pbih,HWND parent);
public:
ImageToAVI();
~ImageToAVI();
bool Create(LPCTSTR fn,int delay,int cx = 0,int cy = 0); void Close(); bool AddFrame(base::gdi::Bitmap& bmp,HWND parent = 0); bool IsOK(){return _aviStream!=0;}
};
#include “stdafx.h”
#include “AVIVideo.h”
inline WORD PaletteSize(WORD color){
if(color>8) return 0;
}
int CreateDibHeader(base::Memory& data,int cx,int cy,int bits){
base::gdi::Bitmap bmp;
bmp.CreateCompatibleBitmap(cx,cy);
if(bits==0) bits = 32;
DWORD hLen = sizeof(BITMAPINFOHEADER) + PaletteSize(bits); data.SetLength(hLen+16); data.Zero(); LPBITMAPINFO pbi = (LPBITMAPINFO)data.Handle(); HPALETTE hpal = (HPALETTE)::GetStockObject(DEFAULT_PALETTE); base::gdi::DC dc; dc.GetDC(); dc.RealizePalette(); pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); if(!count) goto exit; pbi->bmiHeader.biCompression = 0; pbi->bmiHeader.biBitCount = bits; pbi->bmiHeader.biClrUsed = PaletteSize(bits);
exit:
dc.SelectPalette(hpal);
if(!count) return 0;
return hLen;
}
ImageToAVI::ImageToAVI(){
AVIFileInit();
_aopts[0] = &_opts;
_initMember();
}
void ImageToAVI::_initMember(){
_size.SetValue(0,0);
_frames = 0;
_file = NULL;
_aviStream = NULL;
_aviCompressed = NULL;
::ZeroMemory(&_opts,sizeof(_opts));
}
bool ImageToAVI::Create(LPCTSTR fn, int delay, int cx, int cy){
if(_file) return 0;
base::FileSystem fs; fs.Initialize(fn); fs.Delete(); HRESULT hr = AVIFileOpen(&_file,(LPWSTR)fn,OF_WRITE|OF_CREATE,NULL); if(hr!=AVIERR_OK) return 0; _size.SetValue(cx,cy); _delay = delay; return 1;
}
bool ImageToAVI::_initStream(LPBITMAPINFOHEADER pbih,HWND parent){
AVISTREAMINFO strhdr;
::ZeroMemory(&strhdr,sizeof(strhdr));
strhdr.fccHandler = 0;
strhdr.dwScale = 1;
strhdr.dwRate = 1;
strhdr.dwSuggestedBufferSize = pbih->biSizeImage;
SetRect(&strhdr.rcFrame,0,0,pbih->biWidth,pbih->biHeight);
HRESULT hr = AVIFileCreateStream(_file,&_aviStream,&strhdr); if(_aviStream==0){ PrintD(L"ImageToAVI::_initStream: _aviStream = 0"); return 0; } PrintD(L"ImageToAVI::_initStream: AVISaveOptions failed"); return 0; } hr = AVIMakeCompressedStream(&_aviCompressed,_aviStream,&_opts,NULL); if(_aviCompressed==0){ base::Warning(L"Compressed"); PrintD(L"ImageToAVI::_initStream: _aviCompressed = 0"); return 0; } if(hr != AVIERR_OK){ PrintD(L"ImageToAVI::_initStream: AVIStreamSetFormat failed"); return 0; } return 1;
}
void ImageToAVI::Close(){
if(_aviStream) AVIStreamClose(_aviStream);
if(_aviCompressed) AVIStreamClose(_aviCompressed);
if(_file) AVIFileClose(_file);
_initMember();
}
ImageToAVI::~ImageToAVI(){
Close();
AVIFileExit();
}
bool ImageToAVI::AddFrame(base::gdi::Bitmap& bmp,HWND hwnd){
if(!_file){
PrintD(L"ImageToAVI::AddFrame: object not init,call Create first");
return false;
}
if(bmp.IsNull()){
PrintD(L"ImageToAVI::AddFrame: bmp is null");
return 0;
}
if(_size.Value0) _size = bmp.Size();
if(bmp.Size()!=_size){
if(!bmp.Resize(_size.x,_size.y)) return 0;
}
base::Memory dib;
int dibLen = bmp.GetDib(dib,32);
if(dibLen0) return false;
LPBITMAPINFO pbi = (LPBITMAPINFO)dib.Handle(); LPBITMAPINFOHEADER pbih = &pbi->bmiHeader; if(_aviCompressed==0){ if(!_initStream(pbih,hwnd)) return 0; } pbih->biSize + PaletteSize(32), NULL, NULL); if(hr!=AVIERR_OK){ Close(); return false; } _frames++; return true;
}
这篇关于一段将多张图片生成AVI视频的C++源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享
- 2024-07-03微信支付提示订单号重复-icode9专业技术文章分享
- 2024-07-02微服务启动nacos注册上去了,但是一直没有收到请求-icode9专业技术文章分享
- 2024-07-02如何检查文件的编码格式-icode9专业技术文章分享
- 2024-07-02sublime 更改编码格式-icode9专业技术文章分享
- 2024-06-30uniAPP 实现全屏左右滚动滚动的效果-icode9专业技术文章分享
- 2024-06-30如何在本地使用授权或插件-icode9专业技术文章分享
- 2024-06-30伪静态规则配置方法汇总-icode9专业技术文章分享
- 2024-06-29易优CMS安装常见问题汇总-icode9专业技术文章分享
- 2024-06-28易优新手必读安装教程-icode9专业技术文章分享