我在網上下載了一個使用directshow呼叫攝像頭拍照的程式,我運行里面的可執行檔案可以實作拍照的功能。但是當我把程式原始碼編譯通過之后,運行程式拍下的檔案卻沒有影像,這到底怎么回事啊。急急急!!!!!!大神們幫幫我
uj5u.com熱心網友回復:
程式呼叫攝像頭可以實作預覽就是不能拍照
uj5u.com熱心網友回復:
咋就沒人呢
uj5u.com熱心網友回復:
這個部分我原來除錯過,你如果打開檔案不是圖片檔案,不能正確的顯示圖片的話,檢查你寫檔案頭的那部分代碼,可能有問題,實在不行把代碼發上來大家一起看看。uj5u.com熱心網友回復:
#include <vfw.h>
HWND hWndC,ghWndCap;
void __fastcall TfmGoodsPhotoGet::sbCheckVideoClick(TObject *Sender)
{
bool bVFWFlag;
int iVFWCount;
if(!bCheckVideoEnable)
{//探桿打開
hWndC = Panel8->Handle;
//創建捕獲窗,其中hWnd為主視窗句柄
ghWndCap = capCreateCaptureWindow("Capture Window",WS_CHILD|WS_VISIBLE,
0,0,352,298,hWndC,0);
bVFWFlag = false;
iVFWCount = 0;
while((iVFWCount<1000)&&(bVFWFlag==false))
{
bVFWFlag = capDriverConnect(ghWndCap,0);
iVFWCount++;
}
if(bVFWFlag==true)
{
CAPDRIVERCAPS caps;
capDriverGetCaps(ghWndCap,sizeof(caps),&caps);
if(caps.fHasOverlay) capOverlay(ghWndCap,TRUE);
capPreviewScale(ghWndCap,1);
capPreviewRate(ghWndCap,1000/24); // 設定Preview模式的顯示速率
capPreview(ghWndCap,TRUE); //啟動Preview模式
bCheckVideoEnable = true;
sbCheckVideo->Caption = "關閉探桿";
sbCapture->Enabled = true;
}
}
else
{//探桿關閉
if(ghWndCap)
{
capPreview(ghWndCap,false);
capCaptureStop(ghWndCap);
capCaptureAbort(ghWndCap);
capDriverDisconnect(ghWndCap);
::DestroyWindow(ghWndCap);
ghWndCap=NULL;
bCheckVideoEnable = false;
sbCheckVideo->Caption = "打開探桿";
sbCapture->Enabled = false;
}
}
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
前面是預覽抓拍如下
[code=c
#include <vfw.h>
HWND hWndC,ghWndCap;
void __fastcall TfmGoodsPhotoGet::sbCheckVideoClick(TObject *Sender)
{
bool bVFWFlag;
int iVFWCount;
if(!bCheckVideoEnable)
{//探桿打開
hWndC = Panel8->Handle;
//創建捕獲窗,其中hWnd為主視窗句柄
ghWndCap = capCreateCaptureWindow("Capture Window",WS_CHILD|WS_VISIBLE,
0,0,352,298,hWndC,0);
bVFWFlag = false;
iVFWCount = 0;
while((iVFWCount<1000)&&(bVFWFlag==false))
{
bVFWFlag = capDriverConnect(ghWndCap,0);
iVFWCount++;
}
if(bVFWFlag==true)
{
CAPDRIVERCAPS caps;
capDriverGetCaps(ghWndCap,sizeof(caps),&caps);
if(caps.fHasOverlay) capOverlay(ghWndCap,TRUE);
capPreviewScale(ghWndCap,1);
capPreviewRate(ghWndCap,1000/24); // 設定Preview模式的顯示速率
capPreview(ghWndCap,TRUE); //啟動Preview模式
bCheckVideoEnable = true;
sbCheckVideo->Caption = "關閉探桿";
sbCapture->Enabled = true;
}
}
else
{//探桿關閉
if(ghWndCap)
{
capPreview(ghWndCap,false);
capCaptureStop(ghWndCap);
capCaptureAbort(ghWndCap);
capDriverDisconnect(ghWndCap);
::DestroyWindow(ghWndCap);
ghWndCap=NULL;
bCheckVideoEnable = false;
sbCheckVideo->Caption = "打開探桿";
sbCapture->Enabled = false;
}
}
}
//---------------------------------------------------------------------------
][/code]
uj5u.com熱心網友回復:
主要的保存照片代碼就是這一段BOOL SampleGrabberCB::SaveBitmap(BYTE * pBuffer, long lBufferSize )
{
HANDLE hf = CreateFile(
m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE )return 0;
// 寫檔案頭
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
// 寫位圖格式
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = lWidth;
bih.biHeight = lHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
// 寫位圖資料
WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
CloseHandle( hf );
return 0;
}
uj5u.com熱心網友回復:
謝謝這位大哥,但是我最開始就是用的這種方法,這個不能再平板上用,連預覽都不行。我除錯發現在平板上預覽時它是overlay模式而不是Preview模式,強制設成Preview也是無法預覽 不知道是不是因為有前后兩個攝像頭的原因uj5u.com熱心網友回復:
你好,博主,能把你下載到的程式上傳一下嗎?uj5u.com熱心網友回復:
這個不是driectshow的模式打開的,這是vfw轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58115.html
