AVI動画とJPEG静止画の同時保存
イメージデータストリームから1枚のフレームを取得してJPEGファイルに保存する方法を示しています。
Software | IC Imaging Control 3.4, Visual Studio™ 2019 |
---|---|
Download NB.NET sample | image_and_avi_capture_vb_3.4.zip |
通常ICImagingControlでは動画保存と静止画保存を同時に行う事はできませんが、このサンプルではJPEGファイル保存を行う特別なフレームフィルタを使用する事で解決しています。このフレームフィルタはこのサンプルに含まれています。このサンプルは以下の様に動作します。
- ICImagingControl標準のダイアログを使ってデバイスを開き、設定します。
- 現在使用中のビデオデバイスの設定を保存し、次回プログラム起動時に自動的に呼び出します。
- ICImagingControlのウィンドウサイズに応じてライブ表示をリサイズします。
- コンボボックス内に有効なコーデックをリストします。
- コーデックのプロパティを表示します(有効な場合)。
- AVI保存の一時停止と再開
- AVIファイル保存中の静止画保存
機能の多くは他のサンプルで示されていますので、ここでは "Save Image"フレームフィルタについて説明します。初めに、変数タイプ TIS.Imaging.FrameFilterをformの最初に定義しています。この変数は SnapImageFilterと名づけられ、静止画保存フィルタへのアクセスに使用されます。
Dim SnapImageFilter As TIS.Imaging.FrameFilter
"Save Image" フィルタは Form1_load subで読み込まれます。フィルタの読み込み時、SnapImageFilter がフィルタの存在をチェックします。もし見つからない場合、フィルタを読み込むことができません。これはアプリケーションのパスに SaveImageFrameFilter.FTF が無い場合に起こり得ます。この場合、フレームフィルタをソリューションに追加します。
SnapImageFilterが正常にロードされたら、ICImagingControlのデバイスパスに挿入します。
SnapImageFilter = IcImagingControl1.FrameFilterCreate("Save Image", "")
If SnapImageFilter Is Nothing Then
MessageBox.Show
("Failed to load the Snap Image filter", "Filter Loading",
MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
IcImagingControl1.DeviceFrameFilters.Add(SnapImageFilter)
End If
アプリケーションフォームのボタンによって静止画像を保存できるようにするため、ボタンのハンドラーを追加します。ボタンハンドラーbtnSnapImage_Clickは静止画を保存する前にいくつかの動作をします。
- 有効なデバイスが読み込まれているかを確認
- ライブモードになっているかを確認
- SnapImageFilterが正しくロードされているかの確認
SnapImageFilter のパラメータ "ImageName" には有効なファイル名をセットします。このパラメータはアプリケーションのスレッドとICImagingControlのビデオスレッドの間で転送され、SnapImageFilter がイメージを保存します。そのため、これらはBeginParameterTransferとEndParameterTransfer の間にセットされる必要があります。SnapImageFilter はパラメータ"ImageName"がセットされた後、次に入ってくるイメージを取得します。
Private Sub btnSnapImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnSnapImage.Click
With IcImagingControl1
If .DeviceValid = True Then
If .LiveVideoRunning = True Then
If Not SnapImageFilter Is Nothing Then
ImageCounter = ImageCounter + 1
Dim ImageFileName As String
ImageFileName = String.Format("Image{0}.jpg", ImageCounter)
SnapImageFilter.BeginParameterTransfer()
' 画像のファイル名を SnapImageFilter にセットし、静止画を保存します
SnapImageFilter.SetStringParameter("ImageName", ImageFileName)
SnapImageFilter.EndParameterTransfer()
End If
End If
End If
End With
End Sub