カメラで写した写真をカメラロールに保存する
2011年12月5日(月)

ページが非アクティブになった時呼び出されるメソッド
イメージソース ストリームを破棄し、カメラのオブジェクトによって使用されているリソースを解放します。
全てのオブジェクトの関連付けを破棄します。
RemoveHandlerステートメントで、イベントとイベント ハンドラの関連付けを解除します。
Protected Overrides Sub OnNavigatedFrom(e As System.Windows.Navigation.NavigationEventArgs)
If myPhotoCamera Is Nothing = False Then
myPhotoCamera.Dispose()
myPhotoCamera = Nothing
Try
RemoveHandler myPhotoCamera.CaptureCompleted, AddressOf myPhotoCamera_CaptureCompleted
RemoveHandler myPhotoCamera.CaptureImageAvailable, AddressOf myPhotoCamera_CaptureImageAvailable
Catch
Exit Sub
End Try
End If
MyBase.OnNavigatedFrom(e)
End Sub
[Auto Focus]ボタンがクリックされた時の処理
AddHandlerステートメントで、フォーカス操作が完了した後に発生するAutoFocusCompletedイベントに、myPhotoCamera_AutoFocusCompletedイベントハンドラを追加します。
Focusメソッドで、カメラオートフォーカス操作を開始します。
Private Sub focusButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles focusButton.Click
If myPhotoCamera Is Nothing = True Then
Exit Sub
Else
AddHandler myPhotoCamera.AutoFocusCompleted, AddressOf myPhotoCamera_AutoFocusCompleted
myPhotoCamera.Focus()
End If
End Sub
フォーカス操作が完了した後に発生するイベント
RemoveHandlerステートメントで、イベントとイベント ハンドラの関連付けを解除します。
「フォーカス完了」のメッセージを表示します。Me.Dispatcher.BeginInvokeメソッドで、別スレッドからメッセージを呼び出します。
Private Sub myPhotoCamera_AutoFocusCompleted(sender As Object, e As CameraOperationCompletedEventArgs)
RemoveHandler myPhotoCamera.AutoFocusCompleted, AddressOf myPhotoCamera_AutoFocusCompleted
Me.Dispatcher.BeginInvoke(Sub() MessageBox.Show("オートフォーカス完了"))
End Sub
イメージが利用可能な場合に発生する処理
新しいMediaLibrayのインスタンスmyLibrayオブジェクトを作成します。
カウントされる変数counterと拡張子.jpgを連結した文字列をfilename変数に格納しておきます。
MediaLibrayクラスのSavePictureToCameraRollメソッドで、Xnaメディアライブラリを使用して画像を、カメラロールに保存します。
変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドでfilenameに格納しているのと同じファイルが存在する場合は、DeleteFileメソッドで同名ファイルを削除します。
IsolatedStorageFileクラスのOpenFileメソッドでfilename変数内のファイルを、指定したファイルアクセスを使用して指定したモードでファイルを開きます。バイト型として4095の領域を確保します。e.ImageStream.Readメソッドで、イメージストリームからバイト数を読み取り、変数myByteReadに格納します。この変数が、0より大きい間、IsolatedStorageFileStream.Writeメソッドで、読み込んだイメージストリームのバイト数をバッファーに書き込んでいきます。
写真の撮影とエンコードが正しくできているかは、ContentReadyEventArgs.ImageStreamプロパティから取得できますので、これを分離ストレージへ保存します。e.ImageStreamを閉じ、保存した旨のメッセージを表示します。
e.ImageStream.Readの書式は下記の通りです。
e.ImageStream.Read(バイト配列, データの格納を開始するバッファー内のバイト オフセット(通常0を指定),
現在のストリームから読み取るバイトの最大数。)
IsolatedStorageFileStream.Writeメソッドの書式は下記の通りです。
IsolatedStorageFileStream.Write(書き込むバッファー, 開始位置を示すバッファー内のバイト オフセット(通常0を指定) ,書き込む最大バイト数,)
Private Sub myPhotoCamera_CaptureImageAvailable(sender As Object, e As ContentReadyEventArgs)
Dim myLibray As New MediaLibrary
Dim filename As String = counter & ".jpg"
myLibray.SavePictureToCameraRoll(filename, e.ImageStream)
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
If storage.FileExists(filename) = True Then
storage.DeleteFile(filename)
End If
Using myStream As IsolatedStorageFileStream = storage.OpenFile(filename, FileMode.Create, FileAccess.Write)
Dim myBuffer(4095) As Byte
Dim myByteRead As Integer = -1
Do
myByteRead = e.ImageStream.Read(myBuffer, 0, myBuffer.Length)
myStream.Write(myBuffer, 0, myByteRead)
Loop While (myByteRead > 0)
e.ImageStream.Close()
Me.Dispatcher.BeginInvoke(Sub() MessageBox.Show("保存しました。"))
End Using
End Sub
[Shutter]ボタンがクリックされた時の処理
PhotoCameraにファインダーに表示されるイメージがある場合は、CaptureImageメソッドで、ファインダーに表示される現在のイメージのフル解像度キャプチャを開始します。例外が発生した場合は「エラーです。」と表示します。
Private Sub shutterButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles shutterButton.Click
If myPhotoCamera Is Nothing = False Then
Try
myPhotoCamera.CaptureImage()
Catch
Me.Dispatcher.BeginInvoke(Sub() MessageBox.Show("エラーです。"))
End Try
End If
End Sub
キャプチャ シーケンスが完了すると発生するイベント
Sharedステートメントで宣言したcounterの値を1ずつ増加させます。
Private Sub myPhotoCamera_CaptureCompleted(sender As Object, e As CameraOperationCompletedEventArgs)
counter = counter + 1
End Sub
[解像度を低に設定]ボタンがクリックされた時の処理
AvailableResolutionsプロパティで、使用できるカメラの解像度を照会します。
カメラでキャプチャしたイメージの解像度を設定できる、Resolutionプロパティに、先に取得したmyResolutionの一番先頭の解像度を指定します。一番先頭の解像度は640×480の解像度です。
解像度を設定した旨のメッセージを表示します。
Private Sub resolutionButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles resolutionButton.Click
Dim myResolution As IEnumerable(Of Size) = myPhotoCamera.AvailableResolutions
myPhotoCamera.Resolution = myResolution.First
MessageBox.Show("撮影可能な解像度を" & myPhotoCamera.Resolution.ToString & "に設定しました。")
End Sub
End Class
「カメラで写した写真をカメラロールに保存する」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。


