カメラで撮った写真に各種フィルタをかける
2012年1月25日(水)

[カメラ起動]ボタンがタップされた時の処理
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をクリックした時の処理
01 | MenuItemのHeaderの値で条件分岐を行います。 |
02 | Headerの値が、「各種イメージフィルタ」であった場合は、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がホールドされた時の処理。
1 | Image1を引数に、コンテキストメニューを表示する、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がホールドされた時の処理。
1 | Image2を引数に、コンテキストメニューを表示する、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がホールドされた時の処理。
1 | Image3を引数に、コンテキストメニューを表示する、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がホールドされた時の処理。
1 | Image4を引数に、コンテキストメニューを表示する、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コントロールを指定します。
01 | UIElementとして宣言した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を開きます。 |
03 | AddHandlerステートメントで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をクリックした時の処理
01 | MenuItemのHeaderプロパティの値で条件分岐を行います。 |
02 | メニューが「PicturesHUBに保存」の場合の処理です。 |
03 | PicturesHUBに保存するファイル名を現在の「年月日時間分秒.jpg」とし、変数imageFileNameに格納しておきます。 |
04 | ホールドされたImageコントロールで初期化された、新しいWriteableBitmapのオブジェクト、myWriteableBitmapを作成します。WriteableBitmapクラスの第2引数には、ビットマップに特定の変換を適用するTransformを指定できますが、ここではNothingを指定します。WriteableBitmapクラスは、書き込みおよび更新が可能な BitmapSourceを提供するクラスです。 |
05 | 変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言します。FileExistsメソッドで、imageFileNameに格納しているファイルが存在しているかどうかをチェックし、存在している場合はDeleteFileメソッドで同名ファイルを削除します。 |
06 | 分離ストレージ内のファイルを表すIsolatedStorageFileStreamクラス用オブジェクト変数myStream変数を用意し、IsolatedStorageFile.CreateFileメソッドで、分離ストレージ内にimageFileName変数の持っているファイルを作成します。 |
07 | Extensions.SaveJpegメソッドで、WriteableBitmapオブジェクトを、JPEGストリームにエンコードし、一時的に分離ストレージに保存します。これは、JPEGファイルのターゲットとなる幅と高さを設定するためのパラメータを持っています。書式は下記の通りです。 |
08 |
09 | Extensions.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 |
37 | End Class |
「カメラで撮った写真に各種フィルタをかける」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。