2010-11-29 105 views
4

我正在使用WIALib訪問我的攝像頭。我正在開發的代碼非常簡單:當按下按鈕時,拍攝攝像頭圖片,然後顯示在圖片框中。使用WIA在C#中使用攝像頭自動拍攝照片

我已經可以用我的攝像頭拍照了,但還沒有完全自動化。我發現,檢索由攝像頭拍攝的照片的唯一方法,是用這樣的:

wiaPics = wiaRoot.GetItemsFromUI(WiaFlag.SingleImage, WiaIntent.ImageTypeColor) as CollectionClass; 

但是,這要求用戶選擇圖片。我總是希望拍下最後一張照片。所以我想這樣:

string imageFileName = Path.GetTempFileName(); // create temporary file for image 

wiaItem = wiaRoot.TakePicture(); // take a picture 

Cursor.Current = Cursors.WaitCursor; // could take some time 

this.Refresh(); 

wiaItem.Transfer(imageFileName, false); // transfer picture to our temporary file 

pictureBox1.Image = Image.FromFile(imageFileName); // create Image instance from file 

Marshal.ReleaseComObject(wiaItem); 

但方法TakePicture()返回null,所以我不能傳輸圖像。最奇怪的是,這個圖片是在TakePicture()被調用後才真正拍攝的,因爲如果我手動進入網絡攝像頭,圖片就在那裏!我只是不明白它爲什麼不會返回一個值。總結一下,我要麼需要這兩個中的一個: 1.讓TakePicture()工作,返回一個我可以使用的值。 2.自動訪問攝像頭圖片列表,以便檢索最後拍攝的圖片。

最好的問候和感謝的幫助,Micael。

回答

3

從我所看到的,wiaItem = wiaRoot.TakePicture()是走錯了路。試試這個:

string imageFileName; 
wiaRoot.TakePicture(out takenFileName); 
pictureBox1.Image = Image.FromFile(imageFileName); 

TakePicture保存圖片到文件,並返回新的文件名作爲輸出參數。

編輯您的評論 - 您是否使用WiaLib的「Windows 7版本」?如果是這樣,嘗試這樣的事情:

var manager = new DeviceManagerClass(); 
Item wiaItem; 
Device device = null; 
foreach (var info in manager.DeviceInfos) 
{ 
    if (info.DeviceID == DESIRED_DEVICE_ID) 
    { 
     device = info.Connect(); 
     wiaItem = device.ExecuteCommand(CommandID.wiaCommandTakePicture); 
    } 
} 

在您使用與the well known guid的ExecuteCommand(也由COM互操作包裝暴露),而不是TakePicture。無論如何,它對我的​​攝像頭都有效。

+0

感謝菲利普的幫助。事情是,我得到「沒有重載的方法」TakePicture「需要1個參數」的錯誤。 :( – Micael 2010-12-01 11:04:04

相關問題