画像に各種フィルタを適用して保存するWindowsアプリを作る

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

※前ページからの続きです。

[グレースケール]ボタンがクリックされた時の処理

 Private Async Sub grayButton_Click(sender As Object, e As RoutedEventArgs) Handles grayButton.Click
  Dim myBmp = Await GetTestImageAsync()
  mySource = myBmp.EffectGrayscale
  Image1.Source = mySource
  saveButton.IsEnabled = True
End Sub

[ネガティブ]ボタンがクリックされた時の処理

  Private Async Sub negativeButton_Click(sender As Object, e As RoutedEventArgs) Handles negativeButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = myBmp.EffectNegative
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

[セピア]ボタンがクリックされた時の処理

  Private Async Sub sepiaButton_Click(sender As Object, e As RoutedEventArgs) Handles sepiaButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = myBmp.EffectSepia
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

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

  Private Async Sub SaturationButton_Click(sender As Object, e As RoutedEventArgs) Handles SaturationButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = myBmp.EffectSaturation(1.0)
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

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

  Private Async Sub VignettingButton_Click(sender As Object, e As RoutedEventArgs) Handles VignettingButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = Await myBmp.EffectVignettingAsync(1.0) 'エラー
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

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

  Private Async Sub ToycameraButton_Click(sender As Object, e As RoutedEventArgs) Handles ToycameraButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = Await myBmp.EffectToycameraAsync
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

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

  Private Async Sub PosterizeButton_Click(sender As Object, e As RoutedEventArgs) Handles PosterizeButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = myBmp.EffectPosterize(255)
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

[コントラスト]ボタンがクリックされた時の処理

  Private Async Sub contrastButton_Click(sender As Object, e As RoutedEventArgs) Handles contrastButton.Click
    Dim myBmp = Await GetTestImageAsync()
    mySource = myBmp.EffectContrast(1.0)
    Image1.Source = mySource
    saveButton.IsEnabled = True
  End Sub

[Effect適用後の画像保存]ボタンがクリックされた時の処理

SaveAsyncメソッドで、「画像のフォーマット」「保存する場所」「ファイル名」「画像の幅」「画像の高さ」を指定して保存します。ここでは、PNGファイル形式で、ピクチャライブラリ内に、現在の年月日時間分秒のファイル名で保存しています。
[一覧]ボタンの使用を可能にします。

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

  Private Async Sub saveButton_Click(sender As Object, e As RoutedEventArgs) Handles saveButton.Click
    Dim myBmp = DirectCast(Image1.Source, WriteableBitmap)
    Await myBmp.SaveAsync(ImageFormat.Png, ImageDirectories.PicturesLibrary, DateTime.Now.ToString("yyyyMMddHHmmss"), 640, 480)
    ichiranButton.IsEnabled = True
    messageTextBlock.Text = "Picturesフォルダに保存しました。"
  End Sub

[一覧]ボタンがクリックされた時の処理

ピクチャライブラリにアクセスします。GetFileAsyncメソッドでピクチャライブラリ内の画像を取得し、コレクション変数myPictureFilesに格納しておきます。

ListBox内を一度クリアします。クリアしないと、画像が重複して表示されてしまいます。

画像ファイル名を格納しているコレクション変数myPictureFiles内のファイル名を、変数myFileに格納しながら反復処理を行います。

BitmapImageの新しいインスタンスbmpオブジェクトを作成します。SetSourceメソッドにAwait myFile.OpenReadAsyncと指定して、ファイルを開きます。

新しいImageのインスタンスmyImageオブジェクトを作成します。
WidthとHeightを指定します。
Sourceプロパティにbmpオブジェクトを指定します。
ListBoxにAddメソッドでmyImageオブジェクトを追加します。これで、ListBox内に、ピクチャライブラリに保存された、エフェクトのかかった画像の一覧が表示されます。

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

  Private Async Sub ichiranButton_Click(sender As Object, e As RoutedEventArgs) Handles ichiranButton.Click
    Dim myPictureFolder = KnownFolders.PicturesLibrary
    Dim myPictureFiles As IReadOnlyList(Of IStorageFile) = Await myPictureFolder.GetFilesAsync()
    ListBox1.Items.Clear()
    For Each myFile In myPictureFiles
      Dim bmp As New BitmapImage
      bmp.SetSource(Await myFile.OpenReadAsync)
      Dim myImage As New Image
      myImage.Width = 320
      myImage.Height = 240
      myImage.Source = bmp
      ListBox1.Items.Add(myImage)
    Next
  End Sub
End Class

今回でWindows Store Applicationプログラミング(基本編)の解説を終わります。如何だったでしょうか?Windows Store Applicationプログラミングは、コードも比較的短く、使用するメソッド等も、名前から何に使用するメソッドであるかの判断が付きやすく、意外と敷居の低いプログラミングではないかと思います。

この連載を参考にして、ぜひ面白くて独創的なWindows Store Applicationの作成にトライしてください。

では、ありがとうございました。

PROJECT KySS 薬師寺国安

  • 画像に各種フィルタを適用して保存するWindows8サンプルアプリ

薬師寺国安事務所

薬師寺国安事務所代表。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メルマガ会員のサービス内容を見る

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