請問將Panel 上的webcam 影像load 到Image 上 |
尚未結案
|
cowbjt
一般會員 ![]() ![]() 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
我參考版上的討論,使用下列方式
//建立callbackonframe函式,底下為未經壓縮模式24bit沒有調色盤資料 LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr ) { static BITMAPINFOHEADER BitmapHead; static BITMAPINFO BitmapInfo; static BITMAPFILEHEADER BitmapFileHead; CAPSTATUS status; int BIHsize, byte; Byte *ptr; TMemoryStream *stream = new TMemoryStream; VideoStr=LPVIDEOHDR(lpvhdr); // 取得圖片資料 capGetStatus( vc1, &status, sizeof(status) ); // 取得CAP訊息 BIHsize=capGetVideoFormatSize( vc1 ); // 取得圖片格式容量大小 capGetVideoFormat( vc1, &BitmapHead, BIHsize); // 取得圖片格式 代入 bitmapinfohead 內 BitmapInfo.bmiHeader=BitmapHead; // 設定 BITMAPINFO // 取得圖檔總容量 //stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage; stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage-2; // 設定 BITMAPFILEHEAD BitmapFileHead.bfType=0x4D42; //總是 BM BitmapFileHead.bfSize=stream->Size; //該圖檔總大小 //BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead); // 偏移至imagedata大小 BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead)-2; // 偏移至imagedata大小 // 將資料存入 memorystream stream->Position=0; stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); stream->WriteBuffer( &BitmapFileHead.bfReserved1, sizeof(BitmapFileHead.bfReserved1) ); stream->WriteBuffer( &BitmapFileHead.bfReserved2, sizeof(BitmapFileHead.bfReserved2) ); stream->WriteBuffer( &BitmapFileHead.bfOffBits, sizeof(BitmapFileHead.bfOffBits) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); (void*)ptr=stream->Memory; ptr = BitmapFileHead.bfOffBits; Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage); // 存入完成 stream->Position=0; Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); delete( stream ); return(0); }而會出現 "Stream read error" 的錯誤 我是用bcb 6,沒有更新過,而有前輩提過,是size 的問題 所以我也試過將size -2,但還是出現一樣的錯誤 不知道還有什麼沒有注意到的地方 謝謝 |
odyaho
初階會員 ![]() ![]() 發表:60 回覆:104 積分:42 註冊:2005-02-15 發送簡訊給我 |
參考一下
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr ) { static BITMAPINFOHEADER BitmapHead; static BITMAPINFO BitmapInfo; static BITMAPFILEHEADER BitmapFileHead; CAPSTATUS status; int BIHsize, byte; Byte *ptr; TMemoryStream *stream = new TMemoryStream; // 取得圖片資料 VideoStr=LPVIDEOHDR(lpvhdr); // 取得CAP訊息 capGetStatus( vcHWND, &status, sizeof(status) ) ; // 取得圖片格式容量大小 BIHsize=capGetVideoFormatSize( vcHWND ); // 取得圖片格式 代入 bitmapinfohead 內 capGetVideoFormat( vcHWND, &BitmapHead, BIHsize); // 設定 BITMAPINFO BitmapInfo.bmiHeader=BitmapHead; stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead)-2 BitmapHead.biSizeImage;//減2 // 設定 BITMAPFILEHEAD BitmapFileHead.bfType=0x4D42; //總是 BM BitmapFileHead.bfSize=stream->Size; //該圖檔總大小 BitmapFileHead.bfReserved1=(WORD)0; BitmapFileHead.bfReserved2=(WORD)0; BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)-2 sizeof(BitmapHead); // 偏移至imagedata大小//減2 // 將資料存入 memorystream stream->Position=0; stream->WriteBuffer( &BitmapFileHead.bfType, sizeof(BitmapFileHead.bfType) ); stream->WriteBuffer( &BitmapFileHead.bfSize, sizeof(BitmapFileHead.bfSize) ); stream->WriteBuffer( &BitmapFileHead.bfReserved1, sizeof(BitmapFileHead.bfReserved1) ); stream->WriteBuffer( &BitmapFileHead.bfReserved2, sizeof(BitmapFileHead.bfReserved2) ); stream->WriteBuffer( &BitmapFileHead.bfOffBits, sizeof(BitmapFileHead.bfOffBits) ); stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) ); (void*)ptr=stream->Memory; ptr = BitmapFileHead.bfOffBits; Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage); // 存入完成 stream->Position=0; Form7->Image1->Picture->Bitmap->LoadFromStream( stream ); delete( stream ); capSetCallbackOnFrame (vcHWND, NULL); //停止callbackonframe return(0); |
cowbjt
一般會員 ![]() ![]() 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
|
cowbjt
一般會員 ![]() ![]() 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |