カメラで撮った写真に各種フィルタをかける

2012年1月25日(水)
PROJECT KySS

[カメラ起動]ボタンがタップされた時の処理

01ボタンの文字で条件分岐を行います。ボタンの文字が[カメラ起動]の場合は、Showメソッドでカメラ機能を起動します。[元に戻す]の場合は、Image1~Image4コントロールを非表示にし、Image5コントロールのみ表示します。ボタンの文字を[カメラ起動]とします。
02  Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
03    myCameraTask.Show()
04    Case "元に戻す"
05      Image5.Visibility = Windows.Visibility.Visible
06      Image1.Visibility = Windows.Visibility.Collapsed
07      Image2.Visibility = Windows.Visibility.Collapsed
08      Image3.Visibility = Windows.Visibility.Collapsed
09      Image4.Visibility = Windows.Visibility.Collapsed
10      Button1.Content = "カメラ起動"
11    End Select
12  End Sub

Image5をホールドしてコンテキストメニューのMenuItemをクリックした時の処理

01MenuItemのHeaderの値で条件分岐を行います。
02Headerの値が、「各種イメージフィルタ」であった場合は、Image5コントロールを非表示にし、Image1~Image4コントロールを表示します。ボタンの文字を[元に戻す]とします。それ以外の場合は、Image5コントロールを表示します。
03  Private Sub myMenuItem_Click(sender As Object, e As EventArgs)
04    Dim selectHeader = DirectCast(sender, MenuItem).Header
05    Select Case selectHeader.ToString
06      Case "各種イメージフィルタ"
07        Image5.Visibility = Windows.Visibility.Collapsed
08        Image1.Visibility = Windows.Visibility.Visible
09        Image2.Visibility = Windows.Visibility.Visible
10        Image3.Visibility = Windows.Visibility.Visible
11        Image4.Visibility = Windows.Visibility.Visible
12        Button1.Content = "元に戻す"
13      Case Else
14        Image5.Visibility = Windows.Visibility.Visible
15        Exit Sub
16    End Select
17  End Sub

Image1がホールドされた時の処理。

1Image1を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
2  Private Sub Image1_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image1.Hold
3    contextMenuShow(Image1)
4  End Sub

Image2がホールドされた時の処理。

1Image2を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
2  Private Sub Image2_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image2.Hold
3    contextMenuShow(Image2)
4  End Sub

Image3がホールドされた時の処理。

1Image3を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
2  Private Sub Image3_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image3.Hold
3    contextMenuShow(Image3)
4  End Sub

Image4がホールドされた時の処理。

1Image4を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
2  Private Sub Image4_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image4.Hold
3    contextMenuShow(Image4)
4  End Sub

コンテキストメニューを表示する処理。引数としてホールドされたImageコントロールを指定します。

01UIElementとして宣言したimageControlにホールドされたImageコントロールを参照させておきます。
02新しいMeuItemのインスタンスmyMenuItemオブジェクトを作成します。MenuItemクラス型の、新しいリストであるmyMenuItemListを作成します。新しいContextMenuのインスタンス_myContextmenuオブジェクトを作成します。MenuItemのオブジェクトであるmyMenuItemのHeaderプロパティに、「PicturesHubに保存」と指定します。MeuItem型のリストであるmyMenuItemListオブジェクトに、AddメソッドでmyMenuItemオブジェクトを追加します。ContextMenuクラスのオブジェクト_myContextMenuオブジェクトのItemsSourceプロパティに、myMenuItemListオブジェクトを指定します。Opacityプロパティに0.7を指定し表示されるメニューの背景を半透明化しています。ContextMenuService.SetContextMenuメソッドで、ホールドされたImageオブジェクトの ContextMenu プロパティの値を設定します。IsOpenメソッドでContextMenuを開きます。
03AddHandlerステートメントでMenuItemがクリックされた時に、_myMenuItem_Clickを実行するよう指定します。
04  Private Sub contextMenuShow(myControl As UIElement)
05    imageControl = myControl
06    Dim myMenuItem As New MenuItem
07    Dim myMenuItemList As New List(Of MenuItem)
08    Dim _myContextMenu As New ContextMenu
09    myMenuItem.Header = "PicturesHUBに保存"
10    myMenuItemList.Add(myMenuItem)
11    _myContextMenu.ItemsSource = myMenuItemList
12    _myContextMenu.Opacity = 0.7
13    ContextMenuService.SetContextMenu(myControl, _myContextMenu)
14    _myContextMenu.IsOpen = True
15  
16    AddHandler myMenuItem.Click, AddressOf _myMenuItem_Click
17  End Sub

Image1~Image4をホールドしてコンテキストメニューのMenuItemをクリックした時の処理

01MenuItemのHeaderプロパティの値で条件分岐を行います。
02メニューが「PicturesHUBに保存」の場合の処理です。
03PicturesHUBに保存するファイル名を現在の「年月日時間分秒.jpg」とし、変数imageFileNameに格納しておきます。
04ホールドされたImageコントロールで初期化された、新しいWriteableBitmapのオブジェクト、myWriteableBitmapを作成します。WriteableBitmapクラスの第2引数には、ビットマップに特定の変換を適用するTransformを指定できますが、ここではNothingを指定します。WriteableBitmapクラスは、書き込みおよび更新が可能な BitmapSourceを提供するクラスです。
05変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドで、imageFileNameに格納しているファイルが存在しているかどうかをチェックし、存在している場合はDeleteFileメソッドで同名ファイルを削除します。
06分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数myStream変数を用意し、IsolatedStorageFile.CreateFileメソッドで、分離ストレージ内にimageFileName変数の持っているファイルを作成します。
07Extensions.SaveJpegメソッドで、WriteableBitmapオブジェクトを、JPEGストリームにエンコードし、一時的に分離ストレージに保存します。これは、JPEGファイルのターゲットとなる幅と高さを設定するためのパラメータを持っています。書式は下記の通りです。
08 
09Extensions.SaveJpeg(WriteableBitmapオブジェクト,イメージデータストリーム,WriteableBitmapオブジェクトのPixelWidth, WriteableBitmapオブジェクトのPixelHeight,0(固定),0~100の間の写真の品質(70以上を指定))
10 
11ピクチャへのアクセスを提供する新しいMediaLibrayクラスのインスタンス、myLibrayを作成します。分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数であるStream変数を用意し、IsolatedStorageFile.OpenFileメソッドで、imageFileNameに格納されているJPEGファイルを、指定したファイルアクセスを使用して指定したモードで開き、変数Streamで参照します。MediaLibrary.SavePictureメソッドで、ストリームオブジェクトに含まれる画像をメディアライブラリーに保存し、その保存した画像をピクチャオブジェクトとして返します。保存した旨のメッセージを表示します。 これで、分離ストレージ内の画像が、PicturesHUBに保存されます。
12  Private Sub _myMenuItem_Click(sender As Object, e As EventArgs)
13    Dim selectHeader = DirectCast(sender, MenuItem).Header
14    Select Case selectHeader.ToString
15      Case "PicturesHUBに保存"
16        Dim imageFileName As String = DateTime.Now.ToString("yyyyMMddHHmmss") & ".jpg"
17        Dim myWriteableBitmap As WriteableBitmap
18        myWriteableBitmap = New WriteableBitmap(imageControl, Nothing)
19  
20        Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
21        If storage.FileExists(imageFileName) = True Then
22          storage.DeleteFile(imageFileName)
23        End If
24        Using myStream As IsolatedStorageFileStream = storage.CreateFile(imageFileName)
25          System.Windows.Media.Imaging.Extensions.SaveJpeg(myWriteableBitmap, myStream, myWriteableBitmap.PixelWidth, myWriteableBitmap.PixelHeight, 0, 85)
26        End Using
27  
28        Dim myLibray As New MediaLibrary
29        Using Stream As IsolatedStorageFileStream = storage.OpenFile(imageFileName, FileMode.Open, FileAccess.Read)
30          myLibray.SavePicture(imageFileName, Stream)
31          MessageBox.Show("PicturesHubに保存しました。")
32        End Using
33      Case Else
34        Exit Sub
35    End Select
36  End Sub
37End Class
  • 「カメラで撮った写真に各種フィルタをかける」サンプルプログラム

四国の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メルマガ会員のサービス内容を見る

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