線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1577
推到 Plurk!
推到 Facebook!

directshow ampleGrabber抓RGB24由TMemoryThread到Timage

尚未結案
hodalaplus
一般會員


發表:3
回覆:4
積分:1
註冊:2003-10-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-24 21:30:36 IP:163.13.xxx.xxx 未訂閱
抱歉,標題打不下~所以只打了關鍵字^^”    我使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-25 03:43:55 IP:163.13.xxx.xxx 未訂閱
抱歉有些描述寫錯了 修正了一下 也謝謝版主幫我更改格式^^下次會注意版規
hodalaplus
一般會員


發表:3
回覆:4
積分:1
註冊:2003-10-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-25 13:54:57 IP:163.13.xxx.xxx 未訂閱
自問自答一下^^" 首先我把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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-26 15:15:08 IP:140.135.xxx.xxx 未訂閱
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 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
系統時間:2024-05-01 4:04:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!