全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1811
推到 Plurk!
推到 Facebook!

請問將Panel 上的webcam 影像load 到Image 上

尚未結案
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-11 17:50:56 IP:140.124.xxx.xxx 未訂閱
我參考版上的討論,使用下列方式  
 
//建立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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-12 16:23:14 IP:202.181.xxx.xxx 未訂閱
參考一下
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-12 17:25:38 IP:140.124.xxx.xxx 未訂閱
您好: 我看了一下,這二段程式除了變數名稱不太一樣,和"-2" 的前後位置不太一樣之外 其他的好像都一樣耶 當然我也試過用那樣的方式結果還是一樣 我現在的情況是在panel 上可以顯示 但用下面那段將影像load 到image 上時才會有 "Stream read error" 的錯誤發生 Form1->Image1->Picture->Bitmap->LoadFromStream( stream );
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-13 14:09:52 IP:140.124.xxx.xxx 未訂閱
喔喔 原來是有地方不小心貼錯了 odyaho 兄的程式是對的 感謝
系統時間:2024-05-08 4:48:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!