Windows Phone Tips集 第3弾
カメラで撮った写真に各種フィルタをかける(3ページ目)
[カメラ起動]ボタンがタップされた時の処理
ボタンの文字で条件分岐を行います。ボタンの文字が[カメラ起動]の場合は、Showメソッドでカメラ機能を起動します。[元に戻す]の場合は、Image1~Image4コントロールを非表示にし、Image5コントロールのみ表示します。ボタンの文字を[カメラ起動]とします。
Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
myCameraTask.Show()
Case "元に戻す"
Image5.Visibility = Windows.Visibility.Visible
Image1.Visibility = Windows.Visibility.Collapsed
Image2.Visibility = Windows.Visibility.Collapsed
Image3.Visibility = Windows.Visibility.Collapsed
Image4.Visibility = Windows.Visibility.Collapsed
Button1.Content = "カメラ起動"
End Select
End Sub
Image5をホールドしてコンテキストメニューのMenuItemをクリックした時の処理
MenuItemのHeaderの値で条件分岐を行います。
Headerの値が、「各種イメージフィルタ」であった場合は、Image5コントロールを非表示にし、Image1~Image4コントロールを表示します。ボタンの文字を[元に戻す]とします。それ以外の場合は、Image5コントロールを表示します。
Private Sub myMenuItem_Click(sender As Object, e As EventArgs)
Dim selectHeader = DirectCast(sender, MenuItem).Header
Select Case selectHeader.ToString
Case "各種イメージフィルタ"
Image5.Visibility = Windows.Visibility.Collapsed
Image1.Visibility = Windows.Visibility.Visible
Image2.Visibility = Windows.Visibility.Visible
Image3.Visibility = Windows.Visibility.Visible
Image4.Visibility = Windows.Visibility.Visible
Button1.Content = "元に戻す"
Case Else
Image5.Visibility = Windows.Visibility.Visible
Exit Sub
End Select
End Sub
Image1がホールドされた時の処理。
Image1を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
Private Sub Image1_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image1.Hold
contextMenuShow(Image1)
End Sub
Image2がホールドされた時の処理。
Image2を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
Private Sub Image2_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image2.Hold
contextMenuShow(Image2)
End Sub
Image3がホールドされた時の処理。
Image3を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
Private Sub Image3_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image3.Hold
contextMenuShow(Image3)
End Sub
Image4がホールドされた時の処理。
Image4を引数に、コンテキストメニューを表示する、contextMenuShowプロシージャを実行します。
Private Sub Image4_Hold(sender As Object, e As System.Windows.Input.GestureEventArgs) Handles Image4.Hold
contextMenuShow(Image4)
End Sub
コンテキストメニューを表示する処理。引数としてホールドされたImageコントロールを指定します。
UIElementとして宣言したimageControlにホールドされたImageコントロールを参照させておきます。
新しい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を開きます。
AddHandlerステートメントでMenuItemがクリックされた時に、_myMenuItem_Clickを実行するよう指定します。
Private Sub contextMenuShow(myControl As UIElement)
imageControl = myControl
Dim myMenuItem As New MenuItem
Dim myMenuItemList As New List(Of MenuItem)
Dim _myContextMenu As New ContextMenu
myMenuItem.Header = "PicturesHUBに保存"
myMenuItemList.Add(myMenuItem)
_myContextMenu.ItemsSource = myMenuItemList
_myContextMenu.Opacity = 0.7
ContextMenuService.SetContextMenu(myControl, _myContextMenu)
_myContextMenu.IsOpen = True
AddHandler myMenuItem.Click, AddressOf _myMenuItem_Click
End Sub
Image1~Image4をホールドしてコンテキストメニューのMenuItemをクリックした時の処理
MenuItemのHeaderプロパティの値で条件分岐を行います。
メニューが「PicturesHUBに保存」の場合の処理です。
PicturesHUBに保存するファイル名を現在の「年月日時間分秒.jpg」とし、変数imageFileNameに格納しておきます。
ホールドされたImageコントロールで初期化された、新しい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ファイルを、指定したファイルアクセスを使用して指定したモードで開き、変数Streamで参照します。MediaLibrary.SavePictureメソッドで、ストリームオブジェクトに含まれる画像をメディアライブラリーに保存し、その保存した画像をピクチャオブジェクトとして返します。保存した旨のメッセージを表示します。 これで、分離ストレージ内の画像が、PicturesHUBに保存されます。
Private Sub _myMenuItem_Click(sender As Object, e As EventArgs)
Dim selectHeader = DirectCast(sender, MenuItem).Header
Select Case selectHeader.ToString
Case "PicturesHUBに保存"
Dim imageFileName As String = DateTime.Now.ToString("yyyyMMddHHmmss") & ".jpg"
Dim myWriteableBitmap As WriteableBitmap
myWriteableBitmap = New WriteableBitmap(imageControl, 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, myWriteableBitmap.PixelWidth, myWriteableBitmap.PixelHeight, 0, 85)
End Using
Dim myLibray As New MediaLibrary
Using Stream As IsolatedStorageFileStream = storage.OpenFile(imageFileName, FileMode.Open, FileAccess.Read)
myLibray.SavePicture(imageFileName, Stream)
MessageBox.Show("PicturesHubに保存しました。")
End Using
Case Else
Exit Sub
End Select
End Sub
End Class
「カメラで撮った写真に各種フィルタをかける」サンプルプログラム
You don't have access to download this file.
- この記事のキーワード