写真から顔を自動認識して、簡単に目隠し加工する(後編)

2012年3月2日(金)
PROJECT KySS

[PicturesHUBに保存]ボタンがタップされた時の処理

PictureHUBに保存するファイル名を、現在の「年月日時間分秒.jpg」とします。
InkPresenter1で初期化された、新しいWriteableBitmapのオブジェクト、myWriteableBitmapを作成します。WriteableBitmapクラスの第2引数には、ビットマップに特定の変換を適用するTransformを指定できますが、ここではNothingを指定します。WriteableBitmapクラスは、書き込みおよび更新が可能な BitmapSourceを提供するクラスです。
変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドでimageFileNameに格納しているファイルが存在しているかどうかをチェックし、存在している場合は、DeleteFileメソッドで同名ファイルを削除します。
分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数myStream変数を用意し、IsolatedStorageFile.CreateFileメソッドで、分離ストレージ内にimageFileName変数の持っているファイルを作成します。
Extensions.SaveJpegメソッドで、WriteableBitmapオブジェクトを、JPEGストリームにエンコードします。これは、JPEGファイルのターゲットとなる幅と高さを設定するためのパラメータを持っています。書式は下記の通りです。
Extensions.SaveJpeg(WriteableBitmapオブジェクト,イメージデータストリーム,WriteableBitmapオブジェクトのPixelWidth, WriteableBitmapオブジェクトのPixelHeight,0(固定),0~100の間の写真の品質(70以上を指定))
ピクチャへのアクセスを提供する、新しいMediaLibrayクラスのインスタンス、myLibrayを作成します。分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数Stream変数を用意し、IsolatedStorageFile.OpenFileメソッドで、imageFileNameに格納されているJPEGファイルを、指定したファイルアクセスを使用して指定したモードで開きます。MediaLibrary.SavePictureメソッドで、ストリームオブジェクトに含まれる画像を、メディアライブラリーに保存し、その保存した画像をピクチャオブジェクトとして返します。保存した旨のメッセージを表示します。

  Private Sub savePicturesHubButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles savePicturesHubButton.Click
    Dim imageFileName As String = DateTime.Now.ToString("yyyyMMddHHmmss") & ".jpg"
 
    Dim myWriteableBitmap As WriteableBitmap
    myWriteableBitmap = New WriteableBitmap(InkPresenter1, Nothing)
 
    Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
    If storage.FileExists(imageFileName) = True Then
      storage.DeleteFile(imageFileName)
    End If
    Using myStream As IsolatedStorageFileStream = storage.CreateFile(imageFileName)
      System.Windows.Media.Imaging.Extensions.SaveJpeg(myWriteableBitmap, myStream, 448, 336, 0, 85)
    End Using
 
    Dim myLibray As New MediaLibrary
    Using Stream As IsolatedStorageFileStream = storage.OpenFile(imageFileName, IO.FileMode.Open, IO.FileAccess.Read)
      myLibray.SavePicture(imageFileName, Stream)
      MessageBox.Show("PicturesHubに保存しました。")
    End Using
 
    'Dim photoTask As New PhotoChooserTask
    'photoTask.Show()
  End Sub

[この画像をサーバから削除]ボタンがタップされた時の処理

削除確認のメッセージを出し、[OK]の場合の処理です。
新しいWebClientのインスタンスmyWebClientオブジェクトを作成します。WebClientクラスは、データの送受信用のメソッドを提供するクラスです。
HeadersのContent-Typeにapplication/x-www-form-urlencodedと指定します。
UploadStringAsyncメソッドで、文字列にしたmyIndexの値(myIndex.ToString)をサーバにアップロードし、サーバ上のDefault2.aspx(前編で作成)を実行します。
AddHanderステートメントで、非同期の文字列アップロード操作の完了時に発生する、UploadStringCompletedイベントに、イベントハンドラを追加します。イベントハンドラ内では、削除した旨のメッセージを表示します。

  Private Sub deleteButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles deleteButton.Click
    Dim kakunin = MessageBox.Show("この画像を削除しますか?", "削除確認", MessageBoxButton.OKCancel)
 
    Select Case kakunin
      Case MessageBoxResult.OK
        Dim myWebClient As New WebClient
          With myWebClient
            .Encoding = System.Text.Encoding.UTF8
            .Headers("content-type") = "application/x-www-form-urlencoded"
          End With
 
          AddHandler myWebClient.UploadStringCompleted, Sub(resultSender As Object, resultArgs As UploadStringCompletedEventArgs)
            MessageBox.Show("削除しました")
          End Sub
          myWebClient.UploadStringAsync(New Uri("ユーザの専用サーバのURL/ImageFileUpload/Default2.aspx", UriKind.Absolute), myIndex.ToString)
          NavigationService.Navigate(New Uri("/MainPage.xaml", UriKind.Relative))
      Case Else
          Exit Sub
    End Select
  End Sub
End Class

今回も最後までお付き合いいただきありがとうございました。Tips集第3弾は今回で終了です。ぜひ皆さまもWindows Phoneアプリケーションの作成にトライしてみてください。

【お知らせ】

来る3月24日に四国愛媛松山市で、「オープンソースカンファレンス2012Ehime」が開催されます。筆者も「Windows Phone アプリケーション開発入門」の講演を行います。事前受付もしていますので、興味のあるかたはぜひご参加ください。
→参照:オープンソースカンファレンス2012 Ehime

また下記URLにて、筆者がMarketplaceで公開しているWindows Phone
アプリの紹介をしています。これまでの連載記事で紹介した機能も使っていますので、興味のある方は試してみてください。
→参照:Windows Phone App Information

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

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

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

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

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