将bmp 转化为avi

如何将 一系列的bmp 变为 avi呢???

使用系统自带的 vfw32.lib 来制作...

AVIFileInit();

AVIFileOpen

AVIFileCreateStream

AVIMakeCompressedStream

AVIStreamSetFormat

AVIStreamWrite

AVIFileRelease

这是 avi制作的流程...对于具体函数的解释,可以参考msdn .......

你如果图方便不想了解太多...那么可以到

http://www.codeproject.com/bitmap/createmovie.asp

下载你需要的头文件..那么在使用时 会十分简单.....

在你的工程中加入了avifile.h和avifile.cpp后,  接着导入vfw32.lib  (在vc6.0的目录 vc98/lib中)

然后在需要转换的地方添加如下代码:

HBITMAP bmp;

CAviFile avi;

bmp=(HBITMAP)::LoadImage(NULL,"c://a.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

avi.AppendNewFrame(bmp);

 

对于16,24,32位的都可以正常显示....如果是通过位图数据来显示avi ,那么可以调用

avi.AppendNewFrame(636,480,newBits,16);函数

 

如何显示8位的灰度图呢?

按如下步骤:

it took me 3 steps

1:

call appendnewframe with 8 rather than 24:

AppendNewFrame(width,height,p_imData,8);
instead of:
AppendNewFrame(width,height,p_imData,24);

2)

change the following function:
HRESULT CAviFile::AppendFrameFirstTime(int nWidth, int nHeight, LPVOID pBits,int nBitsPerPixel)

this function creates a BITMAPINFO:

/
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biWidth=nWidth;
bmpInfo.bmiHeader.biHeight=nHeight;
bmpInfo.bmiHeader.biCompression=BI_RGB;
bmpInfo.bmiHeader.biBitCount=nBitsPerPixel;
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight*bmpInfo.bmiHeader.biBitCount/8;

if(bmpInfo.bmiHeader.biHeight>nMaxHeight) nMaxHeight=bmpInfo.bmiHeader.biHeight;
if(bmpInfo.bmiHeader.biWidth>nMaxWidth) nMaxWidth=bmpInfo.bmiHeader.biWidth;
/

what you need is this:



LPBITMAPINFO pbmi8;

//bitmap info
pbmi8 = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))];
//bitmap infoheader
pbmi8->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
pbmi8->bmiHeader.biWidth = nWidth;
pbmi8->bmiHeader.biHeight = nHeight;
pbmi8->bmiHeader.biPlanes = 1;
pbmi8->bmiHeader.biBitCount = 8; // bits per pixel
pbmi8->bmiHeader.biCompression = BI_RGB; //uncompressed format
pbmi8->bmiHeader.biSizeImage = 0; // can be 0 for BI_RGB bitmaps
pbmi8->bmiHeader.biXPelsPerMeter = 0;
pbmi8->bmiHeader.biYPelsPerMeter = 0;
pbmi8->bmiHeader.biClrUsed = 256;
pbmi8->bmiHeader.biClrImportant = 0;
//color table
for ( i = 0 ; i < 256 ; ++i )
{
//8-bits grayscale
pbmi8->bmiColors[i].rgbBlue = pbmi8->bmiColors[i].rgbGreen = pbmi8->bmiColors[i].rgbRed = i;
pbmi8->bmiColors[i].rgbReserved = 0;
}

//

(this code could be done better, but, as i mentiond, I'm not an expert)

3)

No, instead of using BITMAPINFO bmpInfo, You use LPBITMAPINFO pbmi8.
Only one time in your code, this bmpInfo is used:

/
if(FAILED(AVIStreamSetFormat(m_pAviCompressedStream,0,(LPVOID)&bmpInfo,bmpInfo.bmiHeader.biSize)))
///

replace this line with:


if(FAILED(AVIStreamSetFormat(m_pAviCompressedStream,0,(LPVOID)pbmi8,sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD)))))


 

你可能感兴趣的:(avi,function,bi,image,table,byte)