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

如何將Image的影像顯示在 Panel上面

尚未結案
lixdon
一般會員


發表:13
回覆:10
積分:4
註冊:2004-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-02 11:44:32 IP:61.155.xxx.xxx 未訂閱
各位大大: 我寫了一個程式,在Panel和Image上顯示影像,並在圖像上畫線,框框。 現在的情況是抓取CCD並顯示影像正常,但Image一直被Panel擋住,Image上畫的線當然也無法顯示了,爲此,我加了Panel1->DoubleBuffered =true;但程式一運行,Panel上的圖像就顯示出來了,不是想象中的效果(不直接顯示在Panel上,由Bitmap貼到Image1中,劃線方便。), Image1->Picture->Bitmap->LoadFromClipboardFormat HDC hDC=GetDC(Panel1->Handle); 以上2種方法都試了,Image1都是被蓋住,如何解決呢? void __fastcall TForm1::FormCreate(TObject *Sender) { Video1 = capCreateCaptureWindow("Capture Window", WS_CHILD|WS_VISIBLE, 0,0,640,480, Form1->Panel1->Handle , 0); //1 capDriverConnect(Video1,0); //get CCD capblility,such as fHasOverlay... capDriverGetCaps(Video1,&CapDrvCaps,sizeof(CAPDRIVERCAPS)); }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-02 13:46:46 IP:140.135.xxx.xxx 未訂閱
lixdon您好: 提醒您,PO程式碼的方式請參考版規說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=47262 針對您的問題,您可以參考下面連結的討論文章 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41192 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
lixdon
一般會員


發表:13
回覆:10
積分:4
註冊:2004-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-02 14:03:14 IP:61.155.xxx.xxx 未訂閱
版大您好: 聯結的文章我已經研究過好幾次,除了CallBack方法外,其餘的都試過了, 現在的問題是Form1顯現後,不論是否Panel1->DoubleBuffered =true;都會有一幅圖像顯示出來,我想也許先將這個問題解決,Image才可能出來,還請繼續指導,給您添麻煩啦。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-02 14:27:01 IP:140.135.xxx.xxx 未訂閱
您好: 小弟不知道正確的做法,但下面的方法是可行的
Video1 = capCreateCaptureWindow("Capture Window",
             WS_CHILD|WS_VISIBLE,0,0,1,1,Panel1->Handle ,0); 
然後TImage讀取剪貼簿上的影像資料,就可以在Image上畫線畫框,且不會被capCreateCaptureWindow所顯示的畫面給蓋掉(因為大小變成1Pixel大)
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
lixdon
一般會員


發表:13
回覆:10
積分:4
註冊:2004-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-03 14:35:41 IP:61.155.xxx.xxx 未訂閱
引言: 您好: 小弟不知道正確的做法,但下面的方法是可行的
Video1 = capCreateCaptureWindow("Capture Window",
             WS_CHILD|WS_VISIBLE,0,0,1,1,Panel1->Handle ,0); 
然後TImage讀取剪貼簿上的影像資料,就可以在Image上畫線畫框,且不會被capCreateCaptureWindow所顯示的畫面給蓋掉(因為大小變成1Pixel大)
taishyang您好: 您的方法我試過了,可以將圖像顯示出來。感謝。 另外:我在參考SDL和您的有關Callbackonframe的程式時,用capSetCallbackOnFrame方法RUN出來的結果不是預期的,不能將圖像顯示出來(Image1全部是白色),但我在程式中畫的線可以顯示,我把程式PO上,
 
//先宣告
LPVIDEOHDR VideoStr;
LRESULT CALLBACK FrameCallBack1(HWND hWnd,Longint lpvhdr);
//一個BUTTON
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//  Form1->DoubleBuffered = true;  //don't show on windows,show on bitmap      capSetCallbackOnFrame(Video1,&FrameCallBack1);
//隨意畫一條線
  Image1->Canvas->MoveTo(70,70) ;
  Image1->Canvas->Pen->Color=clGreen;
  Image1->Canvas->LineTo(450,460);
}
//FrameCallBack1的內容,完全是帖子上的
LRESULT CALLBACK FrameCallBack1(HWND hWnd,Longint lpvhdr)
{
  static BITMAPINFOHEADER BitmapHead;
  static BITMAPINFO       BitmapInfo;
  static BITMAPFILEHEADER BitmapFileHead;
  CAPSTATUS status;
  int BIHsize;
  Byte *ptr;
  TMemoryStream *stream = new TMemoryStream;
  // 取得圖片資料
  VideoStr=LPVIDEOHDR(lpvhdr);
  // 取得CAP訊息
  capGetStatus( Video1, &status, sizeof(status) ) ;
  // 取得圖片格式容量大小
  BIHsize=capGetVideoFormatSize( Video1 );      // 取得圖片格式 代入 bitmapinfohead 內
  capGetVideoFormat( Video1, &BitmapHead, BIHsize);
  // 設定 BITMAPINFO
  BitmapInfo.bmiHeader=BitmapHead;
  // 取得圖檔總容量
 // 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.bfReserved1=(WORD)0;
//  BitmapFileHead.bfReserved2=(WORD)0;
  //該圖檔總大小
  // 偏移至image data大小
  BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead);       // 將資料存入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;         Form1->Image1->Picture->Bitmap->LoadFromStream(stream);
     delete( stream );
     capSetCallbackOnFrame (Video1, NULL);//停止callbackonframe
     return(0);
}
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-04 15:23:32 IP:61.231.xxx.xxx 未訂閱
lixdon您好: 不好意思,新問題請重新發問,以便日後搜尋能搜尋到所要的資料 > 不過要注意的是 > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
lixdon
一般會員


發表:13
回覆:10
積分:4
註冊:2004-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-05 09:59:50 IP:61.155.xxx.xxx 未訂閱
thanks
系統時間:2024-05-10 5:36:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!