Webカメラで撮影した画像に音声コメントを付けて保存・再生するには:2カ月で160本作った還暦開発者が送る10のアプリ開発ノウハウ(6)(4/4 ページ)
古(いにしえ)からのVBでWindows 8.1向けのさまざまな機能のアプリを開発する手順やコツを解説していく。今回は、Webカメラで撮影した画像に音声コメントを付けて保存・再生する方法をサンプルを交えて解説する。
保存した画像の一覧と音声を再生する画面のロジックコード(DataIchiranShowPage.xaml.vb)
次に、[ソリューション・エクスプローラー]内の「DataIchiranShowPage.xaml」を展開して「DataIchiranShowPage.xaml.vb」のコードを記述する。
ここではコードが長くなるため、一部省略している。全てのコードは、サンプルをダウンロードして「DataIchiranShowPage.xaml.vb」ファイルで確認してほしい。
GridView1に画像の一覧を表示する処理(DataShowタスク処理)
Private Async Function DataShow() As Task Dim myFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary Dim mySubFolder = Await myFolder.CreateFolderAsync("ImageVoiceRecord", CreationCollisionOption.OpenIfExists) myPictureFiles = Await mySubFolder.GetFilesAsync If myPictureFiles.Count = 0 Then Dim message As New MessageDialog("画像データがありません。戻ってください。") Await message.ShowAsync Exit Function End If For Each result In myPictureFiles Dim bmp As New BitmapImage bmp.SetSource(Await result.OpenReadAsync) Dim myStackPanel As New StackPanel With myStackPanel .Orientation = Orientation.Horizontal .Margin = New Thickness(5) End With Dim myImage As New Image With myImage .Width = 160 .Height = 120 .Source = bmp End With myStackPanel.Children.Add(myImage) GridView1.Items.Add(myStackPanel) Next AddHandler GridView1.Loaded, AddressOf GridView1_Loaded End Function
以降、上記コードの中身を詳細に見ていこう。
まず、非同期処理で行われるためメソッドの先頭にAsyncを追加している。
次に、ピクチャライブラリーの「ImageVoiceRecord」フォルダーにアクセスし、GetFilesAsyncメソッドで画像ファイルを取得する。画像ファイルがない場合はメッセージダイアログを表示して処理を抜ける。
画像ファイルを格納しているメンバー変数「myPictureFiles」コレクション内のファイルを、変数resultに格納しながら以下の処理を行う。
新しいBitmapImageのインスタンスbmpオブジェクトを作成する。SetSourceメソッドに、「Await result.OpenReadAsync」と指定して、ランダムアクセス用のストリームを開き、BitmapSourceのソースイメージを設定する。
StackPanelの新しいインスタンスmyStackPanelオブジェクトを作成し、オブジェクトのスタック方向を指定するOrientationプロパティに水平方向を表す「Horizontal」を指定する。Marginプロパティに「5」を指定して余白を設ける。
新しいImageのインスタンスmyImageオブジェクトを作成する。Widthに「160」、Heightに「120」を指定して、Sourceプロパティにbmpオブジェクトを追加する。
myStackPanelオブジェクトにAddメソッドでmyImageオブジェクトを追加する。GridView1にAddメソッドでmyStackPanelオブジェクトを追加する。これでGridView1に小さな画像の一覧が表示される。
AddHandlerステートメントでGridView1が読み込まれた時のイベントハンドラを追加しておく。
GridView1の画像が選択された時の処理(GridView1_SelectionChangedメソッド処理)
Private Async Sub GridView1_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles GridView1.SelectionChanged Try playButton.IsEnabled = True myIndex = GridView1.SelectedIndex pauseButton.IsEnabled = False stopButton.IsEnabled = False Dim myFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary Dim mySubFolder = Await myFolder.CreateFolderAsync("ImageVoiceRecord", CreationCollisionOption.OpenIfExists) Dim myFiles = Await mySubFolder.GetFilesAsync Dim bmp As New BitmapImage bmp.SetSource(Await myFiles(myIndex).OpenReadAsync) Image1.Source = bmp Dim wavFolder = KnownFolders.PicturesLibrary Dim myWavSubFolder = Await wavFolder.CreateFolderAsync("ImageRecordSoundFile", CreationCollisionOption.OpenIfExists) Dim myWavFiles = Await myWavSubFolder.GetFilesAsync Dim getWavFile = Await myWavSubFolder.GetFilesAsync(Path.GetFileNameWithoutExtension(myWavFiles(myIndex).Path) & ".mp4") fileNameTextBlock.Text = Path.GetFileNameWithoutExtension(myWavFiles(myIndex).Path) Dim soundStream = Await getWavFile.OpenAsync(FileAccessMode.Read) MediaElement1.SetSource(soundStream, getWavFile.ContentType) deleteButton.IsEnabled = True Catch Exit Sub End Try End Sub
以降、上記コードの中身を詳細に見ていこう。
まず、非同期処理で行われるためメソッドの先頭にAsyncを追加している。
次に、「再生」アイコンの使用を可能にする。GridView1から選択されたインデックスを、メンバー変数「myIndex」に格納しておく。
「休止」「停止」アイコンの使用を不可としておく。ピクチャライブラリー内の「ImageVoiceRecord」フォルダーにアクセスする。
GetFilesAsyncメソッドで画像ファイルを取得して、変数myFilesで参照しておく。
新しいBitmapImageのインスタンスbmpオブジェクトを作成し、SetSourceメソッドに、「Await myFiles(myIndex).OpenReadAsync」と指定して、メンバー変数「myIndex」に対応する、ランダムアクセス用のストリームを開き、BitmapSourceのソースイメージを設定する。
Image1のSourceプロパティにbmpオブジェクトを指定する。GridView1から選択した画像の640×480サイズの画像が表示される。
ピクチャライブラリー内の「ImageRecordSoundFile」フォルダーにアクセスする。GetFilesAsyncメソッドでMP4の音声ファイルを取得して、変数「myWavFiles」で参照しておく。
変数「getWavFile」でMP4ファイルを取得して参照し、「fileNameTextBlock」に拡張子を除いたファイル名を表示する。
OpenAsyncメソッドで、ファイルのランダムアクセスストリームを読み取り専用モードで開き、変数soundStreamで参照しておく。
MediaElement1のSetSourceメソッドで、指定されたストリームを使用して、Sourceプロパティを設定する。SetSourceの書式は下記の通り。
MediaElement.SetSource(stream As Windows.Storage.Streams.IRandomAccessStream,mimeType as String)
最後に、「削除」アイコンの使用を可能にする。
次回は、選択した画像と、テクスチャとなる画像を合成して保存する
今回はここまでだ。また次回の記事でお会いしよう。次回は、選択した画像と、テクスチャとなる画像を合成して保存する方法を紹介する。
関連リンク
本コンテストでは、2013年9月1日〜12月1日に新たにWindowsストアに新規公開されたアプリを募集します。入賞したアプリの製作者には、総額130万円の賞金が授与されますので、ふるってご応募ください。
著者プロフィール
PROJECT KySS 薬師寺 国安(やくしじ くにやす)
1950年生まれ。フリーVBプログラマ。高級婦人服メーカーの事務職に在職中、趣味でVBやActiveXに取り組み、記事を執筆。2003年よりフリー。.NETやRIAに関する執筆多数。Windowsストアアプリも多数公開中(約270本)。
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)。
PROJECT KySSは、1997年に薬師寺聖と結成したコラボレーション・ユニット
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 今でしょ! の終わりに安齋、家入らが評価したアプリとは〜「エイっと作ろう! Windowsストア アプリ選手権」授賞式レポート
謎のキャラ今出しょう子をマスコットに据えたコンテストを勝ち上がった10作品のプレゼン模様などをお届け。 - 初のアジャイル/リモート開発体制でも成功できた秘訣とは〜「Windowsタブレット向けアプリ開発」先駆けインタビュー
日本料理のレシピを海外に紹介するアプリ「Ippin」。初物づくしのアプリ開発を成功させた秘訣をディレクターに聞いた。コミュニケーションツールやドキュメントに盛り込んだ数々の工夫とは、どんなものだったのだろうか。 - PC制御UIの最先端Leapアプリ開発入門(3):ProcessingやWindows 8.1アプリでLeapの空間ジェスチャを使うには
画面タッチやマウスなどのように“触れる”ことなく空中ジェスチャでPC操作が可能な新しいデバイスLeap Motionを使い、これまでにないアプリを開発しましょう。今回は、ゲームループやLeapのジェスチャ3種Circle、Swipe、Tap、ProcessingのLeapジェスチャアプリ、そしてMVVMパターンで指の数を検出するC#アプリについて解説します。 - Web開発者が手っ取り早くストアデビューする方法(1):Windowsストアにアプリを登録するための事前準備
Windowsストア初心者のために(主に、HTMLやJavaScriptを扱うWeb開発者向けに)、簡単なアプリを開発してWindowsストアに手っ取り早くデビューする手順を解説します。初回は、Microsoftアカウントの取得、Windowsストアアプリ開発者登録、開発環境準備について。 - 連載:Windowsストア・アプリ開発入門:第1回 Windowsストア・アプリってどんなもの?
ついにWindows 8.1の正式版がMSDNサブスクライバー向けに公開された。無償アップデートとなるため、今後は新しいWindows 8.1ストア・アプリが一般化するだろう。最新環境向けに新たにアプリ開発を始める人のための連載スタート。 - 特集:次期Windows 8.1&Visual Studio 2013 Preview概説(前編):大きく変わるWindowsストア・アプリ開発 〜 ビュー状態に関連する変更点
Windows 8.1(Preview版)の変更点や新機能を開発者視点で紹介。Windows 8用に作られたWindowsストア・アプリにはどんな影響があるのか? - UXClip(11):これからが本番、Windows 8アプリ開発
12月3日夜、Windows 8のハードウェアやアプリを開発者向けに紹介するイベントが行なわれた - Windows 8提供開始、対応アプリ登場は期待できるか?
マイクロソフトはWindows 8の提供を正式に開始した。Windowsストアもスタートし、いよいよWindows 8プラットフォームが市場投入となる。