directshow ampleGrabber抓RGB24由TMemoryThread到Timage |
尚未結案
|
hodalaplus
一般會員 發表:3 回覆:4 積分:1 註冊:2003-10-18 發送簡訊給我 |
抱歉,標題打不下~所以只打了關鍵字^^” 我使用directshow使用sampleGabber的範例stillGap來抓圖
放到TMemoryThread後想用TImage的LoadFromStream來放到TImage上顯示
但是不是沒反應就是"not a valid bitmap",不然就是"error read stream" 我的程式碼如下
設定SamplGrabber的格式部分 AM_MEDIA_TYPE mt; ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); mt.majortype = MEDIATYPE_Video; mt.subtype = MEDIASUBTYPE_RGB24; pGrabber->SetMediaType(&mt); pGrabber->SetBufferSamples( false ); pGrabber->SetOneShot( false ); pGrabber->SetCallback( &m_CB, 1 ); SampleGrabber的BufferCB callback 抓圖的部分 { if( !bSnapOneShot ) return 0; bSnapOneShot=false; m_dblSampleTime = dblSampleTime; m_lBufferSize = lBufferSize; if (!m_pBuffer) { m_pBuffer = new BYTE[lBufferSize]; } if (m_pBuffer) { memcpy(m_pBuffer, pBuffer, lBufferSize); } PostMessage(hwnd, WM_CAPTURE_BITMAP, 0, 0); return 0; } 放到Timage的部分 TMemoryStream* BMPStream=new TMemoryStream(); BMPStream->Read(Form1->cBuilder->m_CB.m_pBuffer,Form1->cBuilder- >m_CB.m_lBufferSize); Form1->Image1->Picture->Bitmap->PixelFormat=pf24bit; Form1->Image1->Picture->Bitmap->LoadFromStream(BMPStream); 此時檢查m_CB.m_lBufferSize是203400(有抓到size),但是TMemoryStream 的size卻是0,這裡的問題是需要設定pf24bit嗎,Timage的長寬是否需要設定才能正確讀取 TMemoryStream在Read後要不要把Positon設成0,size是否在Read完要自已設定 LoadFromStream應不用自行避過點陣圖的表頭吧? 因為saveToStream後將position設為0在LoadFromStream到另一個Image 是可以正常顯示的,並沒有額外設定長寬和跳過表頭啊? 我為了這個找了好久,大家都是直接loadfromStream即可,我想大概是抓到的 sample的問題吧,可是繼然有抓到size,所以我假設也有抓到buffer (沒法檢查有沒有抓到buffer), 那麼資料應該正常,或者是Samplebuffer 只傳給我不含表頭的raw data?? 小弟第一次發表問題,看到版上每每有前輩解答, 希望也能給小弟解惑,感恩不盡, 將以常發表文章為報........ 發表人 - taishyang 於 2003/10/24 22:23:06 |
hodalaplus
一般會員 發表:3 回覆:4 積分:1 註冊:2003-10-18 發送簡訊給我 |
|
hodalaplus
一般會員 發表:3 回覆:4 積分:1 註冊:2003-10-18 發送簡訊給我 |
自問自答一下^^" 首先我把write 和 read 搞錯了,write才是寫入stream啦.... 接下來從directshow抓下來的raw data是不含表檔的 想要用TImage的loadFromStream()則需要依序自行加上 BITMAPFILEHEADER和BITMAPINFOHEADER 只要在write從directshow抓下來的raw data之前先寫入就好了 記得在loadFromStream之前要先將stream的position設為0 因為write會加stream的position而loadFromStream會從positoin 開始load, 還有個重要的東西,就是sizeof(BITMAPFILEHEADER)在BCB裡是16 byte 但是在微軟的表頭是定義14byte 所以write的時候記得是這樣 myStream->write(myFileHeader,sizeof(BITMAPFILEHEADER)-2) 給自已鼓勵鼓勵~啪啪啪啪啪^^
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
hodalaplus您好:
引言:還有個重要的東西,就是sizeof(BITMAPFILEHEADER)在BCB裡是16 byte 但是在微軟的表頭是定義14byte所以write的時候記得是這樣 myStream->write(myFileHeader,sizeof(BITMAPFILEHEADER)-2)這樣的現象是BCB6.0的問題,記得要Update喔 請參考下面連結的討論 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22856 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |