CountDownControlを使ってカウントダウン後にカメラのシャッターを切る

2013年1月16日(水)
薬師寺 国安

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainWindow.xaml.vb)

写真、オーディオの録音とビデオのキャプチャを提供するクラスの含まれるWindows.Media.Captur名前空間をインポートします。

Imports Windows.Media.Capture

ファイル、フォルダー、およびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。

Imports Windows.Storage

プロパティのメディア フォーマットを作成するために必要な、その他のプログラミング要素を提供するクラスの含まれる、Windows.Media.MediaProperties名前空間をインポートします。

Imports Windows.Media.MediaProperties

シーケンシャルとランダム アクセスのストリームの読み書きを提供するクラスの含まれる、Windows.Storage.Streams名前空間をインポートします。

Imports Windows.Storage.Streams

ユーザーが HTTP 経由の最新の Web サービスを実行できるようにする HTTP のクライアント コンポーネント。クライアントとサーバーの両方で使用できる HTTP のコンポーネントを提供するクラスの含まれるSystem.Net.Http名前空間をインポートします。

Imports System.Net.Http

ネットワークアプリケーションで使用される、ホスト名やエンドポイントにアクセスを提供するクラスの含まれる、Windows.Networking名前空間をインポートします。

Imports Windows.Networking

パスコード、パスフレーズ、およびその他の識別情報を管理する共通の方法を提供するクラスの含まれる、Windows.Security.Credentials名前空間をインポートします。

Imports Windows.Security.Credentials

アプリ内でダウンロードしたり、アップロードしたりする機能を提供するクラスの含まれる、Windows.Networking.BackgroundTransfer名前空間をインポートします。

Imports Windows.Networking.BackgroundTransfer

XMLドキュメントモデル(DOM)をサポートするクラスの含まれる、Windows.Data.Xml.Dom名前空間をインポートします。

Imports Windows.Data.Xml.Dom

Public NotInheritable Class MainPage
  Inherits Page

ファイルを表すインターフェース型のIReadonlyList型のメンバ変数myPictureFilesを宣言します。IReadonlyList(Of Out T)はインデックスでアクセスできる要素の読み取り専用コレクションを表します。

  Dim myPictureFiles As IReadOnlyList(Of IStorageFile)

新しいMediaCaptureクラスの型のmyMediaCaptureオブジェクトを作成し、メンバ変数として宣言します。MediaCaptureクラスは、フォト、オーディオ録音、およびビデオキャプチャを表すクラスです。

  Dim myMediaCapture As New MediaCapture
 
  Dim Index As Integer

ページがアクティブになった時の処理

InitializeAsyncメソッドでMediaCaptureを初期化します。CaptureElementのSourceプロパティにMediaCaptureのインスタンスmyMediaCaptureオブジェクトを指定します。StartPreviewAsyncメソッドでプレビューを開始します。Webカメラが表示されます。

ピクチャライブラリのPhotoImageサブフォルダー内の画像一覧を、GridViewに追加するAddPhotoプロシージャを実行します。

非同期処理に行われるため、メソッドの先頭にAsyncを追加します。

  Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
    Await myMediaCapture.InitializeAsync()
    CaptureElement1.Source = myMediaCapture
    Await myMediaCapture.StartPreviewAsync
    AddPhoto()
  End Sub

ピクチャライブラリのPhotoImageサブフォルダー内の画像一覧を表示する処理

ピクチャライブラリにアクセスします。CreateFolderAsyncでPhotoImageサブフォルダーを作成しますが、CreationCollisionOption.OpenIfExistsを指定することで、既にフォルダーが存在する場合は、そのフォルダー名を返してくれます。フォルダーが存在しない場合は作成してくれます。

ピクチャライブラリのPhotoImageサブフォルダーにアクセスします。CreationCollisionOption列挙体については下記URLを参照してください。
 → CreationCollisionOption enumeration (Windows)

GetFileAsyncメソッドでPhotoImageサブフォルダー内のファイルを取得し、ファイルのコレクションを表すメンバ変数myPictureFilesに格納しておきます。

コレクション変数myPictureFiles内のファイルを変数myPhotoFileに格納しながら、以下の処理を反復します。

新しいBitmapImageのインスタンスmyBmpオブジェクトを作成し、SetSourceメソッドに、Await myPhotoFile.OpenSequentialReadAsyncと指定して、アクセス用のストリームを順次開いていきます。

新しいImageのインスタンスmyImageオブジェクトを作成します。Widthに320、Heightに240と指定します。ImageのSourceプロパティにストリームを開いているmyBmpオブジェクトを指定します。GridViewのAddメソッドでmyImageオブジェクトを追加していきます。これで、PhotoImageサブフォルダー内に画像があれば、画像の一覧が表示されます。ない場合は何も表示されません。

非同期処理に行われるため、メソッドの先頭にAsyncを追加します。

  Private Async Sub AddPhoto()
    Dim myFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("PhotoImage", CreationCollisionOption.OpenIfExists)
    myPictureFiles = Await mySubFolder.GetFilesAsync()
 
    For Each myPhotoFile In myPictureFiles
      Dim bmp As New BitmapImage
      bmp.SetSource(Await myPhotoFile.OpenSequentialReadAsync)
      Dim myImage As New Image
      myImage.Width = 320
      myImage.Height = 240
      myImage.Source = bmp
      GridView1.Items.Add(myImage)
    Next
  End Sub

[シャッター]ボタンがクリックされた時の処理

CountdownControlの秒数を設定するSecondプロパティに5を指定し、カウントダウンを5秒とします。

  Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click
    TextBlock1.Text = String.Empty
    CountdownControl1.Seconds = 5
  End Sub

カウントダウンが終わった時の処理。

MediaElementのPlayメソッドでシャッター音を再生します。

画像を保存するPhotoSaveプロシージャを実行します。

  Private Sub CountdownControl1_CountdownComplete(sender As Object, e As RoutedEventArgs) Handles CountdownControl1.CountdownComplete
    MediaElement1.Play()
    TextBlock1.Text = "保存しました。"
    PhotoSave()
  End Sub

Webカメラで撮った画像を保存する処理

ピクチャライブラリのPhotoImageというサブフォルダーにアクセスします。

CreateFileAsyncで「年月日時間秒分.jpg」ファイルを作成し、myFile変数で参照しておきます。

イメージストリームの書式を表すImageEncodingPropertiesクラスの新しいインスタンス、myImageEncodingPropertyオブジェクトを作成します。

フォーマットのサブタイプを設定するSubTypeプロパティに「Jpeg」と指定します。

WidthとHeightの値を指定します。

CapturePhotoToStorageFileAsyncメソッドで、出力イメージのエンコードプロパティ(Jpgで640×480)と、保存する画像ファイル名、とを指定して、ストレージファイルにフォトをキャプチャします。

非同期処理で行われるためメソッドの先頭にAsyncを追加します。

  Private Async Sub PhotoSave()
    Dim myFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary
    Dim mySubFolder = Await myFolder.CreateFolderAsync("PhotoImage", CreationCollisionOption.OpenIfExists)
    Dim myFile As StorageFile = Await mySubFolder.CreateFileAsync(DateTime.Now.ToString("yyyyMMddHHmmss") & ".jpg")
 
    Dim myImageEncodingProperty As New ImageEncodingProperties
    myImageEncodingProperty.Subtype = "jpeg"
    myImageEncodingProperty.Width = 640
    myImageEncodingProperty.Height = 480
    Await myMediaCapture.CapturePhotoToStorageFileAsync(myImageEncodingProperty, myFile)
  End Sub
  • CountDownControlを使ってカウントダウン後にカメラのシャッターを切る

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています