メールの送信と写真を撮る

2011年11月14日(月)
PROJECT KySS

次に、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
  • 「メールの送信」サンプルプログラム

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

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