那就麻煩大家了.
解AVI的那一個程式太雜太大了,所以難po上來,在此po CAM的程式,
仍然是使用Repaint(),問題依舊.
//------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include "vfw.h" //-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1; //HDRAWDIB hCapWnd;
HWND hCapWnd;
LRESULT PASCAL OnFrame(HWND Hwnd,LPVIDEOHDR lpvhead);
int cwidth=320,cheight=240;
bool Preview; //-------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{ Form1->DoubleBuffered=true;
Image1->Picture->Bitmap= new Graphics::TBitmap();
Image1->Picture->Bitmap->Height=cheight;
Image1->Picture->Bitmap->Width=cwidth;
Image1->Picture->Bitmap->PixelFormat=pf24bit;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Connect1Click(TObject *Sender)
{
ConnectCamera();
GetCameraName();
N320x2401Click(Sender);
PreView1Click(Sender);
DisplayCameraInfo(hCapWnd);
} //-------------------------------------------------------------------
bool TForm1::ConnectCamera()
{ if (hCapWnd)
return true; if(!PreDetectCameraInfo())
{
StatusBar1->Panels->Items[0]->Text="No device.";
return false;
}
hCapWnd = capCreateCaptureWindow("My Capture Window",
WS_CHILD | WS_VISIBLE,
Panel1->Left 2, Panel1->Top 2, cwidth, cheight,
Form1->Handle, 0); if (!hCapWnd)
{
StatusBar1->Panels->Items[0]->Text="Not Connect...";
return false;
}
else
{
if(!capDriverConnect (hCapWnd, 0))
{
StatusBar1->Panels->Items[0]->Text="Not Connect...";
return false;
} StatusBar1->Panels->Items[0]->Text="Connecting...";
capPreviewRate(hCapWnd, 33.3);
capSetCallbackOnFrame(hCapWnd, OnFrame);
return true;
} } //-------------------------------------------------------------------
void __fastcall TForm1::Disconnect1Click(TObject *Sender)
{
DisConnectCamera(&hCapWnd);
} //-------------------------------------------------------------------
void TForm1::GetCameraName()
{ char szDeviceName[80];
char szDeviceVersion[80]; for (int i= 0; i< 10; i )
{
if(capGetDriverDescription(i, szDeviceName, sizeof (szDeviceName),
szDeviceVersion,sizeof (szDeviceVersion)))
{
ListBox1->Items->Add(szDeviceName);
ListBox1->Items->Add(szDeviceVersion);
} } } //-------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Disconnect1Click(Sender);
exit(0);
} //-------------------------------------------------------------------
void __fastcall TForm1::GetInfo1Click(TObject *Sender)
{
CAPDRIVERCAPS cap; if (!hCapWnd)
return; capDriverGetCaps(hCapWnd,&cap,sizeof(CAPDRIVERCAPS));
if(!cap.fHasDlgVideoDisplay)
capDlgVideoFormat(hCapWnd);
else
capDlgVideoDisplay(hCapWnd); } //-------------------------------------------------------------------
void __fastcall TForm1::N320x2401Click(TObject *Sender)
{ if (!hCapWnd)
return;
N160x1201->Checked=false;
N320x2401->Checked=true; AdjustCapSize(&hCapWnd, 320,240); DisConnectCamera(&hCapWnd);
ConnectCamera();
ImagePreView(hCapWnd, Preview);
} //-------------------------------------------------------------------
void __fastcall TForm1::N160x1201Click(TObject *Sender)
{ if (!hCapWnd)
return; N160x1201->Checked=true;
N320x2401->Checked=false; AdjustCapSize(&hCapWnd, 160,120); DisConnectCamera(&hCapWnd);
ConnectCamera();
ImagePreView(hCapWnd, Preview);
ChangeVideoPos(hCapWnd,50,50,160,120);
DisplayCameraInfo(hCapWnd); } //-------------------------------------------------------------------
void TForm1::DisplayCameraInfo(HWND Hnd)
{ BITMAPINFO bmi; if (!Hnd)
return; GetCameraInfo(Hnd,&bmi); ListBox2->Items->Add(bmi.bmiHeader.biWidth);
ListBox2->Items->Add(bmi.bmiHeader.biHeight);
ListBox2->Items->Add(bmi.bmiHeader.biBitCount);
ListBox2->Items->Add(bmi.bmiHeader.biCompression);
ListBox2->Items->Add(bmi.bmiHeader.biSizeImage);
} //-------------------------------------------------------------------
void __fastcall TForm1::PreView1Click(TObject *Sender)
{
PreView1->Checked=!PreView1->Checked;
Preview=PreView1->Checked;
ImagePreView(hCapWnd, PreView1->Checked);
} //------------------------------------------------------------------- void __fastcall TForm1::Scale1Click(TObject *Sender)
{
Scale1->Checked=!Scale1->Checked; ImageScale(hCapWnd,Scale1->Checked);
} //-------------------------------------------------------------------
void __fastcall TForm1::Capture2Click(TObject *Sender)
{
SaveVideoFrame(hCapWnd,"Clip.bmp"); } //------------------------------------------------------------------- void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Edit1->Text=TrackBar1->Position;
ChangeVideoRate(hCapWnd,TrackBar1->Position);
} //===================================================================
// Capture Video Tools
//===================================================================
void TForm1::ImagePreView(HWND Hnd, bool Checked)
{
if (!Hnd)
return; if(Checked)
capPreview(Hnd, true);
else
capPreview(Hnd, false);
} //-------------------------------------------------------------------
void TForm1::ImageScale(HWND Hnd, bool Checked)
{
if (!Hnd)
return; if(Checked)
capPreviewScale(hCapWnd,true);
else
capPreviewScale(hCapWnd,false); } //-----------------------------------------------------------
LRESULT PASCAL OnFrame(HWND Hwnd,LPVIDEOHDR lpvhead)
{
Byte *ptr1;
int Y = -1; for (int y = cheight-1; y >=0; y--)
{
ptr1 = (Byte *) Form1->Image1->Picture->Bitmap->ScanLine[y];
for (int x = 0; x < cwidth*3; x =3)
{
ptr1[x] = (Byte)lpvhead->lpData[ Y];
ptr1[x 1] = (Byte)lpvhead->lpData[ Y];
ptr1[x 2] = (Byte)lpvhead->lpData[ Y]; }
}
Form1->Image1->Repaint(); return 0;
} //-------------------------------------------------------------------
bool TForm1::PreDetectCameraInfo()
{
HWND CapWnd;
BITMAPINFO bmi; CapWnd = capCreateCaptureWindow("My Capture Window",
WS_CHILD | WS_VISIBLE,
8, 24, cwidth, cheight,
Form1->Handle, 0); if(!CapWnd)
return false; if(!capDriverConnect (CapWnd, 0))
return false; GetCameraInfo(CapWnd,&bmi); cwidth=bmi.bmiHeader.biWidth;
cheight=bmi.bmiHeader.biHeight; capDriverDisconnect(CapWnd); return true; } //-------------------------------------------------------------------
void TForm1::DisConnectCamera(HWND *Hnd)
{
if (!*Hnd)
return; capDriverDisconnect(*Hnd); *Hnd=NULL;
StatusBar1->Panels->Items[0]->Text="Disconnect..."; } //-------------------------------------------------------------------
void TForm1::AdjustCapSize(HWND *Hnd, int w, int h)
{
BITMAPINFO bmi; if (!*Hnd)
return; GetCameraInfo(*Hnd,&bmi); cheight=h,cwidth=w; bmi.bmiHeader.biWidth=cwidth;
bmi.bmiHeader.biHeight=cheight;
bmi.bmiHeader.biBitCount=24;
SetCameraInfo(*Hnd,bmi); DisConnectCamera(Hnd);
ConnectCamera(); } //-------------------------------------------------------------------
void TForm1::GetCameraInfo(HWND Hnd,BITMAPINFO *bmi)
{
if (!Hnd)
return; capGetVideoFormat(Hnd, bmi, sizeof(BITMAPINFO));
} //-------------------------------------------------------------------
void TForm1::SetCameraInfo(HWND Hnd,BITMAPINFO bmi)
{
if (!Hnd)
return; capSetVideoFormat(Hnd, &bmi,sizeof(BITMAPINFO));
} //-------------------------------------------------------------------
void TForm1::ChangeVideoPos(HWND Hnd, int x, int y, int w, int h)
{
if (!Hnd)
return; CAPSTATUS s;
capGetStatus(Hnd, &s, sizeof(CAPSTATUS));
s.uiImageWidth=w;
s.uiImageHeight=h;
SetWindowPos(Hnd,NULL,x,y,s.uiImageWidth,s.uiImageHeight,WS_CHILD | WS_VISIBLE); } //-------------------------------------------------------------------
void TForm1::SaveVideoFrame(HWND Hnd,AnsiString Str)
{
if (!Hnd)
return; capFileSaveDIB(Hnd,Str.c_str()); } //------------------------------------------------------------------- void __fastcall TForm1::Capture3Click(TObject *Sender)
{
Image2->Picture->Assign(Image1->Picture);
} //-----------------------------------------------------------
void TForm1::ChangeVideoRate(HWND Hnd,int Rate)
{
if (!Hnd)
return; capPreviewRate(Hnd, Rate); } //------------------------------------------------------------------- void __fastcall TForm1::GetDevices1Click(TObject *Sender)
{
GetCameraName();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Source1Click(TObject *Sender)
{
capDlgVideoSource(hCapWnd);
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->DoubleBuffered=true;
}
//---------------------------------------------------------------------------
發表人 - taishyang 於 2003/12/03 22:39:44