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に画像を表示します。
