PictureHubから画像を取得するコード
PictureModelクラスにPictureHubから画像を取得するコードを記述しましょう。PictureModelクラスを読み解くには、コードの後ろの方にあるShowメソッドの内容から見ていくのが良いでしょう。
Public Class PictureModel Implements INotifyPropertyChanged Private PhotoTask As New Microsoft.Phone.Tasks.PhotoChooserTask ''' <summary> ''' PictureHubから画像を選択する ''' </summary> ''' <param name="parameter">画像描画領域の最大</param> ''' <remarks></remarks> Public Sub Show(ByVal parameter As Size) Me.ActureSize = parameter AddHandler Me.PhotoTask.Completed, (Sub(d_Sender, d_e) If d_e.TaskResult = Microsoft.Phone.Tasks.TaskResult.OK Then Dim photo As New Imaging.BitmapImage photo.SetSource(d_e.ChosenPhoto) photo.CreateOptions = BitmapCreateOptions.IgnoreImageCache Me.Original_Bitmap = New C1.Phone.Imaging.C1Bitmap(New Imaging.WriteableBitmap(photo)) End If End Sub) Me.PhotoTask.Show() End Sub End Class
using System; using System.ComponentModel; using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; namespace CZ1206ImageCS { public class PictureModel : INotifyPropertyChanged { private Microsoft.Phone.Tasks.PhotoChooserTask PhotoTask = new Microsoft.Phone.Tasks.PhotoChooserTask(); /// <summary> /// PictureHubから画像を選択する /// </summary> /// <param name="size"></param> internal void Show(Size parameter) { this.ActureSize = parameter; this.PhotoTask.Completed += (d_sender, d_e) => { if (d_e.TaskResult == Microsoft.Phone.Tasks.TaskResult.OK) { BitmapImage photo = new BitmapImage(); photo.SetSource(d_e.ChosenPhoto); photo.CreateOptions = BitmapCreateOptions.IgnoreImageCache; this.Original_Bitmap = new C1.Phone.Imaging.C1Bitmap(new WriteableBitmap(photo)); } }; this.PhotoTask.Show(); } } }
STEP1:
Showメソッドは画面表示サイズをparameterパラメタで受け取り、内部変数のActureSizeに保存します。
STEP2:
PhotoChooserTaskのComplatedイベントのイベントプロシージャを、ラムダ式で次のように定義します。
AddHandler Me.PhotoTask.Completed, (Sub(d_Sender, d_e) …………End Sub)
this.PhotoTask.Completed += (d_sender, d_e) => { …………}
この定義部分は、すぐには実行されません。
STEP3:
PhotoChooserTaskのShowメソッドを実行してPictureHubの画像選択画面が表示されたら、本プロシージャの実行が完了し、呼び出し元に復帰します。
STEP4:
写真が選択された時に初めてCompletedイベントが発生してCompletedイベントプロシージャが呼び出されます。このプロシージャの中では、指定された画像をC1Bitmap型のOriginal_Bitmapプロパティに代入します。Original_Bitmapプロパティは設定した画像を画面のサイズに合わせて縮小表示してくれるプロパティです。
Private Property Original_Bitmap As C1.Phone.Imaging.C1Bitmap Get Return _OriginalBitmap End Get Set(value As C1.Phone.Imaging.C1Bitmap) _OriginalBitmap = value If Me.ActureSize.Width < value.Width Then Me.Scale = Math.Ceiling((Me.ActureSize.Width / value.Width) * 100) / 100 End If If Me.ActureSize.Height < value.Height Then Dim heightScale As Double = Math.Ceiling((Me.ActureSize.Height / value.Height) * 100) / 100 If Me.Scale > heightScale Then Me.Scale = heightScale End If End If If Me.Scale > 1.0 Then Me.Scale = 1.0 End If Me._Item = New C1.Phone.Imaging.C1Bitmap(CType(value.Width * Me.Scale, Integer), _ CType(value.Height * Me.Scale, Integer)) Me._Item.Copy(value, True) Call NotifyPropertyChanged("Item") End Set End Property Private Property _OriginalBitmap As C1.Phone.Imaging.C1Bitmap = Nothing Public Property Item As C1.Phone.Imaging.C1Bitmap Get Return _Item End Get Set(value As C1.Phone.Imaging.C1Bitmap) _Item = value Call NotifyPropertyChanged("Item") End Set End Property Private Property _Item As C1.Phone.Imaging.C1Bitmap = Nothing
private C1.Phone.Imaging.C1Bitmap Original_Bitmap { get { return _OriginalBitmap; } set { _OriginalBitmap = value; if (this.ActureSize.Width < value.Width) { this.Scale = Math.Ceiling((this.ActureSize.Width / value.Width) * 100) / 100; } if (this.ActureSize.Height < value.Height) { double heightScale = Math.Ceiling((this.ActureSize.Height / value.Height) * 100) / 100; if (this.Scale > heightScale) { this.Scale = heightScale; } } if (this.Scale > 1.0) { this.Scale = 1.0; } this._Item = new C1.Phone.Imaging.C1Bitmap((int)(value.Width * this.Scale), (int)(value.Height * this.Scale)); this._Item.Copy(value, true); NotifyPropertyChanged("Item"); } } private C1.Phone.Imaging.C1Bitmap _OriginalBitmap = null; public C1.Phone.Imaging.C1Bitmap Item { get { return _Item; } set { _Item = value; NotifyPropertyChanged("Item"); } } private C1.Phone.Imaging.C1Bitmap _Item = null;
STEP5:
Original_Bitmapプロパティに値を設定すると、set部にvalue値として設定値が渡されます。set部では画面表示部の縦サイズと画像の縦サイズ、画面表示部の横サイズと画像の横サイズを比較して縦横比を崩さずに画面に収めるための縮小比Scaleを計算します。
今回のサンプルでは画面表示部よりも画像サイズが小さいときには拡大は行わないので、Scale > 1.0の場合は等倍になるように1.0の値をScale値に採用しています。
STEP6:
Scale値が決まれば、あとは、C1Bitmapの機能を使って画面の縮小を行い、その結果をItemプロパティに設定してNotifyPropertyChangedイベントを発生させます。
このイベントはViewModelを経由してMainPage.xaml.vb(MainPage.xaml.cs)のPropertyChangedイベントプロシージャを起動し、MainPage.xamlに画像を表示します。