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

我想要儲存擷取下的圖片到c槽

尚未結案
639673
一般會員


發表:36
回覆:4
積分:8
註冊:2005-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-11 13:30:24 IP:211.76.xxx.xxx 未訂閱
各位大大~~拜託幫幫我!我想儲存圖片到c槽~run都沒問題~但是就是不能存~麻煩幫我看看有那邊不對的~給予指教~謝謝 //--------------------------------------------------------------------------- #include  #pragma hdrstop #include #include "MainForm.h" #include "AudioAMU.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; bool OK; bool flag; bool DisplayLocal; bool PlayAudioFlag=false; COMPVARS CompressorSetting; BITMAPINFO bitmap_input; BITMAPINFO bitmap_output; int AudioCount=0; int width=320; int height=240; AudioAMU audioObj; UDPbyAMU TransferObj1; // for Video SOCKET SOCKADDR_IN remote1; int VideoPort; UDPbyAMU TransferObj2; // for Audio SOCKET SOCKADDR_IN remote2; HDC hdc1; int AudioPort; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OK=false; Form1->Button1->Caption="Start"; flag=false; Form1->Button2->Caption="Disable Local Display"; DisplayLocal=true; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; Form1->Quit->Enabled=false; audioObj.AudioCapInit(); audioObj.AudioPlayInit(); } //--------------------------------------------------------------------------- bool TForm1::CapInit() { CAPTUREPARMS CapParms; int WSIZE; CapWin=capCreateCaptureWindow((LPTSTR)("Capture Window"), (WS_CHILD|WS_VISIBLE),0,0, width,height,Form1->Handle,0); if(CapWin==0) return false; OK=capDriverConnect(CapWin,0); if(!OK) return false; OK=capCaptureGetSetup(CapWin, long(&CapParms), sizeof(CAPTUREPARMS)); if(!OK) return false; CapParms.dwRequestMicroSecPerFrame=66667; // 15 FPS Requested capture rate CapParms.fLimitEnabled = false; CapParms.fCaptureAudio = false; // NO Audio CapParms.fMCIControl = false; CapParms.fYield = true; CapParms.vKeyAbort = false; CapParms.fAbortLeftMouse = false; CapParms.fAbortRightMouse = false; OK=capCaptureSetSetup(CapWin,long(&CapParms),sizeof(CAPTUREPARMS)); if(!OK) return false; // Callback Function OK=capSetCallbackOnVideoStream(CapWin,TForm1::VideoCompress); if(!OK) return false; WSIZE=capGetVideoFormat(CapWin,&bitmap_input,sizeof(BITMAPINFO)); if(WSIZE==0) return false; OK=capSetVideoFormat(CapWin,&bitmap_input,sizeof(BITMAPINFO)); if(!OK) return false; // Choose Compressor CompressorSetting.cbSize=sizeof(COMPVARS); while(!ICCompressorChoose(Form1->Handle,ICMF_CHOOSE_DATARATE|ICMF_CHOOSE_PREVIEW, &(bitmap_input.bmiHeader),0,&CompressorSetting,"Compressor")); if(ICCompressBegin(CompressorSetting.hic,&bitmap_input,CompressorSetting.lpbiOut) != ICERR_OK) return false; if(ICDecompressBegin(CompressorSetting.hic,CompressorSetting.lpbiOut,&bitmap_input) != ICERR_OK) return false; return true; } //--------------------------------------------------------------------------- bool TForm1::StartCap() { OK=capCaptureSequenceNoFile(CapWin); if(!OK) return false; else return true; } //--------------------------------------------------------------------------- bool TForm1::StopCap() { OK=capCaptureStop(CapWin); if(!OK) return false; else return true; } //--------------------------------------------------------------------------- LRESULT CALLBACK TForm1::VideoCompress(HWND CapW,LPVIDEOHDR lpVHdr) { LPVOID lpBit; lpBit=lpVHdr->lpData; if(DisplayLocal) { Form1->Memo1->Lines->Add("DisplayLocal"); // ShowOnForm int startX1=0; int startY1=0; HDRAWDIB hdd1; //////////////// hdd1=DrawDibOpen(); hdc1=GetDC(CapW); DrawDibBegin(hdd1,hdc1,width,height,&(bitmap_input.bmiHeader),width,height,NULL); DrawDibRealize(hdd1,hdc1,0); DrawDibDraw(hdd1,hdc1,startX1,startY1,width,height, &(bitmap_input.bmiHeader),lpBit, 0,0,width,height,DDF_SAME_DRAW|DDF_SAME_HDC); DrawDibEnd(hdd1); ReleaseDC(CapW,hdc1); } // Compression char CompressBuff[300000]; DWORD param1; DWORD param2; if(ICCompress(CompressorSetting.hic,CompressorSetting.dwFlags, &(CompressorSetting.lpbiOut->bmiHeader),CompressBuff, &(bitmap_input.bmiHeader),lpBit,¶m1,¶m2, 1L,0,0,NULL,NULL) == ICERR_OK) { Form1->Memo1->Lines->Add("Compress Success"); Form1->Memo1->Lines->Add(String("compressed image size : ") CompressorSetting.lpbiOut->bmiHeader.biSizeImage); // UDP Socket remote1.sin_family=AF_INET; remote1.sin_port=htons(VideoPort); remote1.sin_addr.s_addr=inet_addr(Form1->RemoteAddr->Text.c_str()); TransferObj1.FillSock(remote1); int iRet=TransferObj1.UDPSend(CompressBuff,int(CompressorSetting.lpbiOut->bmiHeader.biSizeImage)); Form1->Memo1->Lines->Add(AnsiString(iRet) " Bytes Video Frame Send Success !!"); } return (LRESULT) true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(!flag) { PlayAudioFlag=true; Button1->Caption="Stop"; flag=true; Form1->Button1->Enabled=false; Form1->RemoteAddr->Enabled=false; Form1->Port->Enabled=false; Form1->Quit->Enabled=true; VideoPort=StrToInt(Form1->Port->Text); AudioPort=VideoPort 1; if( (TransferObj1.SockInit()==0) && (TransferObj2.SockInit()==0) ) { Form1->Memo1->Lines->Add("Socket Initialization Success !!"); if( (TransferObj1.SockBind(VideoPort)==0) && (TransferObj2.SockBind(AudioPort)==0) ) { Form1->Memo1->Lines->Add("Socket Bind Success !!"); WSAAsyncSelect(TransferObj1.UDP_Sock,Form1->Handle,WM_NET,FD_READ|FD_WRITE); WSAAsyncSelect(TransferObj2.UDP_Sock,Form1->Handle,WM_NET,FD_READ|FD_WRITE); OK=(CapInit()); if(!OK) { Button1->Caption="Start"; flag=false; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; Application->MessageBox("Error to Initialize Video Devices !!","Error",MB_OK); } else { //Start to Capture Video and Audio OK=( (StartCap()) && (audioObj.StartCapAudio()) ); if(!OK) { Button1->Caption="Start"; flag=false; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; Application->MessageBox("Error to Capture Frames!!","Error",MB_OK); } } } else { Form1->Memo1->Lines->Add("Socket Bind Failure !!"); Button1->Caption="Start"; flag=false; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; } } else { Form1->Memo1->Lines->Add("Socket Initialization Failure !!"); Button1->Caption="Start"; flag=false; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; } } else { bool ok2,ok3,ok9; Form1->RemoteAddr->Enabled=true; Form1->Port->Enabled=true; AudioCount=0; while(!capSetCallbackOnVideoStream(CapWin,NULL)); ok9=capDriverDisconnect(CapWin); ok2=(ICCompressEnd(CompressorSetting.hic) == ICERR_OK); ok3=(ICDecompressEnd(CompressorSetting.hic) == ICERR_OK); if(ok2&&ok3&&ok9) { TransferObj1.CloseSock(); TransferObj1.EndUDPbyAMU(); TransferObj2.CloseSock(); TransferObj2.EndUDPbyAMU(); Button1->Caption="Start"; flag=false; } else { Application->MessageBox("Cannot Close Multimedia Devices!!","Error!!",MB_OK); Close(); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { flag=false; // audioObj.CloseCapAudio(); // audioObj.ClosePlayAudio(); } //--------------------------------------------------------------------------- void __fastcall TForm1::NetProc(TMessage msg) { int buffsize; int startX2=350; int startY2=0; char DecompressBuff[300000]; switch(WSAGETSELECTEVENT(msg.LParam)) { case FD_READ: // Videio Frame Processing if((SOCKET) msg.WParam==TransferObj1.UDP_Sock) { buffsize=TransferObj1.UDPRecv(TransferObj1.recvBuff); Form1->Memo1->Lines->Add("Video Frame Accepted"); Form1->Memo1->Lines->Add("Video Frame Size : " AnsiString(buffsize) " Bytes"); // Decompression if(ICDecompress(CompressorSetting.hic,ICDECOMPRESS_UPDATE, &(CompressorSetting.lpbiOut->bmiHeader),TransferObj1.recvBuff, &(bitmap_input.bmiHeader),DecompressBuff) == ICERR_OK) { Form1->Memo1->Lines->Add("Decompress Success"); // ShowOnForm HDRAWDIB hdd2; HDC hdc2; hdd2=DrawDibOpen(); hdc2=GetDC(Form1->Handle); DrawDibBegin(hdd2,hdc2,width,height,&(bitmap_input.bmiHeader),width,height,NULL); DrawDibRealize(hdd2,hdc2,0); DrawDibDraw(hdd2,hdc2,startX2,startY2,width,height, &(bitmap_input.bmiHeader),DecompressBuff, 0,0,width,height,DDF_SAME_DRAW|DDF_SAME_HDC); DrawDibEnd(hdd2); ReleaseDC(Form1->Handle,hdc2); } else { Form1->Memo1->Lines->Add("Decompress Failure"); } } // Audio Frame Processing else if((SOCKET) msg.WParam==TransferObj2.UDP_Sock) { if(PlayAudioFlag) { buffsize=TransferObj2.UDPRecv(TransferObj2.recvBuff); Form1->Memo1->Lines->Add("Audio Frame Accepted"); Form1->Memo1->Lines->Add("Audio Frame Size : " AnsiString(buffsize) " Bytes"); //find a wOutHdr which has been played to be copied for(AudioCount = 0; AudioCount < LIST_LENGTH; AudioCount ) if(audioObj.wOutHdr[AudioCount].dwFlags & WHDR_DONE) break; // Can't find any wOutHdr has been played. Give in it. if(AudioCount >= LIST_LENGTH) break; memcpy(audioObj.wOutHdr[AudioCount].lpData,TransferObj2.recvBuff,buffsize); audioObj.wOutHdr[AudioCount].dwLoops=0; audioObj.StartPlayAudio(audioObj.wOutHdr[AudioCount]); } } break; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if(!DisplayLocal) { DisplayLocal=true; Form1->Button2->Caption="Disable Local Display"; } else { DisplayLocal=false; Form1->Button2->Caption="Enable Local Display"; } } //--------------------------------------------------------------------------- void __fastcall TForm1::QuitClick(TObject *Sender) { PlayAudioFlag=false; while(!audioObj.StopPlayAudio()); while(!audioObj.StopCapAudio()); while(!StopCap()); Form1->Button1->Enabled=true; Form1->Quit->Enabled=false; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { Form1->Edit1->Text = Now().FormatString("yyyymmddhhnnss") ".bmp"; String PicName = Form1->Edit1->Text; capFileSaveDIB(hdc1,PicName.c_str()); } //---------------------------------------------------------------------------
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-11 14:35:23 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 >
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-12 16:21:19 IP:202.181.xxx.xxx 未訂閱
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  Form1->Edit1->Text = Now().FormatString("yyyymmddhhnnss") ".bmp";
  String PicName = "C:\\" Form1->Edit1->Text;
  capFileSaveDIB(hdc1,PicName.c_str());
}
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-18 14:46:15 IP:219.86.xxx.xxx 未訂閱
剛試一下  是ok的 參考一下
    //---------------------------------------------------------------------------    #include 
#include 
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    HWND vcHWND;
CAPTUREPARMS capparms;
bool ScanDriver = false;
AnsiString CCD1;
String DT;
int T;
char name[10][80],ver[10][80];
AnsiString Device,Ver;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
vcHWND = capCreateCaptureWindow ( "Capture Window",
 WS_CHILD | WS_VISIBLE ,68,55,Width,Height,Panel1->Handle, 0);  //設定視窗大小     for(int i=0;i<10;i  )
 {
  ScanDriver=capDriverConnect(vcHWND,i);
  if(ScanDriver)
  {
    if ( capGetDriverDescription( i,name[i],80,ver[i],80) )
    {
      Device=name[i];
      Ver=ver[i];
    }
    break;
  }
 }
  if(!ScanDriver)
   ShowMessage("攝影機連接失敗..");       capPreviewRate(vcHWND,1000/33);
   capPreview(vcHWND,true);    }
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
 capDriverDisconnect(vcHWND);
 DestroyWindow(vcHWND);
 ScanDriver = false;    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
   String PicName = "C:\\" Now().FormatString("yyyymmddhhnnss") ".bmp";
   capFileSaveDIB(vcHWND,PicName.c_str());
}
//---------------------------------------------------------------------------
系統時間:2024-05-08 4:54:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!