4

Web カメラにアクセスするために WIALib を使用しています。私が開発しているコードは非常に単純です。ボタンを押すと、ウェブカメラの画像が撮影され、画像ボックスに表示されます。

ウェブカメラで写真を撮ることはできますが、まだ完全には自動化されていません。ウェブカメラで撮影した写真を取得するために私が見つけた唯一の方法は、これを使用することです:

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() が呼び出された後に写真が実際に撮影されたことです。手動でウェブカメラに行くと写真がそこにあるからです! 値を返さない理由がわかりません。

要約すると、次の 2 つのいずれかが必要です。 1. TakePicture() を機能させ、使用できる値を返す。2. Web カメラの写真のリストに自動的にアクセスして、最後に撮影した写真を取得できるようにします。

よろしくお願いします。助けてくれてありがとう、ミカエル。

4

1 に答える 1

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);
    }
}

ここでは、TakePicture ではなく、よく知られた GUID (これも COM 相互運用ラッパーから公開されます) でExecuteCommand を使用します。いずれにせよ、それは私のウェブカメラで機能しました。

于 2010-11-30T22:09:55.020 に答える