連載 :
Windows Phone Tips集メールの送信と写真を撮る
2011年11月14日(月)

次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックしてリスト4のコードを記述します。
ロジックコードを記述する
リスト4 (MainPage.xaml.vb)
Option Strict On
ランチャーやチューザーに関するクラスの含まれる、Microsoft.Phone.Tasks名前空間をインポートします。
Imports Microsoft.Phone.Tasks
仮想ファイルシステムを作成および使用するための型が含まれている、System.IO.IsolatedStorage 名前空間をインポートします。
Imports System.IO.IsolatedStorage
画像を表示させるのに必要なクラスの含まれる、Imports System.Windows.Media.Imaging名前空間をインポートします。
Imports System.Windows.Media.Imaging
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports Microsoft.Phone.Controls
Partial Public Class MainPage
Inherits PhoneApplicationPage
' コンストラクター
Public Sub New()
InitializeComponent()
' ListBox コントロールのデータ コンテキストをサンプル データに設定します
'DataContext = App.ViewModel
End Sub
OSの持っている写真を撮影する機能を呼び出す、CameraCaptureTaskクラス用メンバ変数、myCameraCaptureTaskを宣言します。
Dim myCameraCaptureTask As CameraCaptureTask
WriteableBitmapクラス型のメンバ変数myWriteableBitmap変数を宣言します。WriteableBitmapクラスは、書き込みおよび更新が可能なBitmapSourceを提供するクラスです。
Dim myWriteableBitmap As WriteableBitmap
ページが読み込まれた時の処理
新しいCameraCaptureTaskのインスタンスを生成します。
撮影が終了した時に発生するCompletedイベントに、イベントハンドラを追加します。
写真の撮影が正常に完了すれば、新しいBitmapImageクラスのインスタンスmyImageオブジェクトを生成します。
CameraCaptureTaskで撮った写真を、Imageコントロール内に表示すると、90度回転した形で表示されます。これでは具合が悪いので、再度90度回転して正常な位置に戻します。CompositeTransformの新しいインスタンスであるmyCompositeTransformオブジェクトを生成します。CompositeTransformクラスは、1 つのオブジェクトに複数の異なる変換を適用することができるクラスです。CenterXプロパティに、ImageコントロールのWidthの半分の値を、CenterYプロパティに、ImageコントロールのHeightの半分の値を指定します。回転を表すRotationプロパティに90を指定します。
myImageオブジェクトにSetSourceメソッドで撮影された写真のデータをセットします。Image1コントロールのSourceプロパティに写真のデータのセットされたmyImageオブジェクトを指定します。Image1のRenderTransformプロパティにmyCompositeTransformオブジェクトを指定します。これで、Image1コントロール内に正常な位置の画像が表示されます。RenderTransFormプロパティでは、要素の描画位置に影響する変換情報を設定できます。
Image1で初期化された、新しいWriteableBitmapのインスタンス、myWriteableBitmapオブジェクトを生成します。WriteableBitmapクラスの第2引数には、ビットマップに特定の変換を適用するTransformを指定します。何も指定しない場合はNothingを指定します。今回は画像を90度回転して保存するため、myCompositeTransformオブジェクトを指定しています。
新しいImageのインスタンスmyImageAreaオブジェクトを生成します。Marginプロパティに10を指定して余白を設けます。SourceプロパティにImage1で初期化されたmyWriteableBitmapオブジェクトを指定します。ListBox1にAddメソッドでmyImageAreaオブジェクトを追加します。撮影した写真が順次ListBox1に追加されていきます。
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
myCameraCaptureTask = New CameraCaptureTask
AddHandler myCameraCaptureTask.Completed, Sub(resultSender As Object, resultArgs As PhotoResult)
If resultArgs.TaskResult = TaskResult.OK Then
Dim myLibray As New MediaLibrary
Dim myImage As New BitmapImage
Dim myCompositeTransform As New CompositeTransform
myCompositeTransform.CenterX = 200
myCompositeTransform.CenterY = 208
myCompositeTransform.Rotation = 90
myImage.SetSource(resultArgs.ChosenPhoto)
Image1.Source = myImage
Image1.RenderTransform = myCompositeTransform
myWriteableBitmap = New WriteableBitmap(Image1, myCompositeTransform)
Dim myImageArea As New Image
With myImageArea
.Margin = New Thickness(10)
.Source = myWriteableBitmap
End With
ListBox1.Items.Add(myImageArea)
End If
End Sub
End Sub
[カメラ起動]ボタンをクリックした時の処理
Showメソッドで、OSの持っている写真撮影機能を呼び出します。
Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
myCameraCaptureTask.Show()
End Sub
[クリア]ボタンをクリックした時の処理
写真の追加されていたListBox1内をクリアします。
Private Sub Button2_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
ListBox1.Items.Clear()
End Sub
[保存]ボタンがクリックされた時の処理
ファイル名が入力されていなかったり、拡張子が.jpgでない場合は警告メッセージを表示して処理を抜けます。
ファイル名がきちんと入力されている場合は、以下の処理を行います。
変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言し、呼び出し元のコードのアプリケーションIDに対応する、ユーザースコープの分離ストレージを取得します。分離ストレージにTextBoxに入力されたファイル名と同じファイルが存在する場合は削除します。
IsolatedStorageFileStreamクラス型のmyStream変数を宣言し、ファイルとディレクトリを格納している分離ストレージ領域を表す、IsolatedStorageFileクラスのCreateFileメソッドで、分離ストア内にTextBoxに入力されたファイル名のファイルを作成します。
Extension.SaveJpegメソッドで、WriteableBitmap オブジェクトを、JPEG ファイルのターゲットの幅と高さを設定するためのパラメーターを持つ、 JPEG ストリームにエンコードします。
書式は以下の通りです。
Extension.SaveJpeg(WriteableBitmapオブジェクト,イメージデータのストリーム,ファイルのターゲット幅,ファイルのターゲット高さ,未使用で0を指定します,0~100の間で写真の品質を指定します。70以上の設定が推奨されています)
IsolatedStorageFileStreamを閉じます。
MediaLibraryの新しいインスタンスであるmyLibrayオブジェクトを生成します。MediaLibrayクラスは、曲、再生リスト、およびデバイスのメディア・ライブラリの写真へのアクセスを提供するクラスです。
OpenFileメソッドで、指定したファイルアクセスを使用して指定したモードでファイルを開きます。読み取り専用で開きます。MediaLibrayクラスのSavePictureメソッドで、ストリーム オブジェクトに含まれる画像をメディア・ライブラリに保存し、その保存した画像をピクチャオブジェクトとして返します。画像はPicturesHUBに保存されます。IsolatedStorageFileStreamを閉じます。
Private Sub Button3_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button3.Click
If TextBox1.Text = String.Empty OrElse TextBox1.Text.Contains(".jpg") = False Then
MessageBox.Show("保存ファイル名を入力してください。拡張子は.jpgです。")
Exit Sub
Else
Dim myJPG As String = TextBox1.Text
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
If storage.FileExists(myJPG) = True Then
storage.DeleteFile(myJPG)
End If
Dim myStream As IsolatedStorageFileStream = storage.CreateFile(myJPG)
Extensions.SaveJpeg(myWriteableBitmap, myStream, myWriteableBitmap.PixelWidth, myWriteableBitmap.PixelHeight, 0, 85)
myStream.Close()
Dim myLibray As New MediaLibrary
myStream = storage.OpenFile(myJPG, IO.FileMode.Open, IO.FileAccess.Read)
myLibray.SavePicture(TextBox1.Text, myStream)
myStream.Close()
MessageBox.Show("PicturesHubに保存しました。")
End If
End Class
「メールの送信」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- 「英文Webの部分翻訳」と「QRコードの生成」のサンプル
- 駅マスタ検索APIとBingMaps
- 「住所の位置をBing Mapsに表示する」と「位置に画像付きピンを表示する」のサンプル
- モーションセンサーとShareStatusTask、MediaPlayerLauncherを使う
- カメラで写した写真を分離ストレージに保存し、写真の一覧を表示する
- Bing APIを使ってWeb検索とImage検索を実装する
- バックグラウンドによるファイル転送(後編)
- 楽天Webサービスを利用したジャンル別商品検索
- ローカルデータベースの利用と郵便番号検索
- コントロールの視覚効果とパノラマページの背景画像を変える


