下面为设置capSetCallbackOnFrame的回调函数,但是在bmTest->LoadFromStream(stream)是报告“stream read error”错误,怀疑是从缓冲区取到MemoryStream的数据不正确,但是苦于没有相关资料,所以请大虾们帮助解决!
LRESULT CALLBACK FrameCallBack(HWND hwnd, Longint lpvhdr)
{
static BITMAPINFOHEADER BitmapHead;
static BITMAPINFO BitmapInfo;
static BITMAPFILEHEADER BitmapFileHead;
CAPSTATUS status;
int BIHsize, byte;
Byte *ptr;
LPVIDEOHDR VideoStr;
TMemoryStream *stream = new TMemoryStream;
// 取得圖片資料
VideoStr = LPVIDEOHDR(lpvhdr);
// 取得CAP訊息
capGetStatus(hwnd, &status, sizeof(status)) ;
// 取得圖片格式容量大小
BIHsize = capGetVideoFormatSize(hwnd);
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat(hwnd, &BitmapHead, BIHsize);
// 設定 BITMAPINFO
BitmapInfo.bmiHeader = BitmapHead;
// 取得圖檔總容量
stream->Size = sizeof(BitmapFileHead) + sizeof(BitmapHead) + BitmapHead.biSizeImage;
// 設定 BITMAPFILEHEAD
BitmapFileHead.bfType = 0x4D42; //總是 BM
BitmapFileHead.bfSize = stream->Size; //該圖檔總大小
BitmapFileHead.bfOffBits = sizeof(BitmapFileHead) + sizeof(BitmapHead); // 偏移至imagedata大小
// 將資料存入 memorystream
stream->Position=0;
stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) );
stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
(void*)ptr=stream->Memory;
ptr += BitmapFileHead.bfOffBits;
Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage);
// 存入完成
stream->Position=0;
//
//bmTest为全局对象,Graphics::TBitmap类型
if(bmTest)
bmTest->LoadFromStream(stream);
delete(stream);
bAssigned = true;
capSetCallbackOnFrame(hwnd, NULL); //停止callbackonframe
return(0);
}