SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)

画像処理ができるWindows Phoneアプリケーションを作ろう

~ComponentOne Studio for Windows Phoneを活用したアプリ例~

  • このエントリーをはてなブックマークに追加

PictureHubから画像を取得するコード

 PictureModelクラスにPictureHubから画像を取得するコードを記述しましょう。PictureModelクラスを読み解くには、コードの後ろの方にあるShowメソッドの内容から見ていくのが良いでしょう。

リスト5-1 PicuterHubから画像を取得するModelの例(Visual Basic)
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
リスト5-2 PicuterHubから画像を取得するModelの例(C#)
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イベントのイベントプロシージャを、ラムダ式で次のように定義します。

リスト6-1 イベント登録ラムダ式の例(Visual Basic)
AddHandler Me.PhotoTask.Completed, (Sub(d_Sender, d_e) …………End Sub)
リスト6-2 イベント登録ラムダ式の例(C#)
this.PhotoTask.Completed += (d_sender, d_e) => { …………}

 この定義部分は、すぐには実行されません。

 STEP3:

 PhotoChooserTaskのShowメソッドを実行してPictureHubの画像選択画面が表示されたら、本プロシージャの実行が完了し、呼び出し元に復帰します。

 STEP4:

 写真が選択された時に初めてCompletedイベントが発生してCompletedイベントプロシージャが呼び出されます。このプロシージャの中では、指定された画像をC1Bitmap型のOriginal_Bitmapプロパティに代入します。Original_Bitmapプロパティは設定した画像を画面のサイズに合わせて縮小表示してくれるプロパティです。

リスト7-1 縮小表示するための実装例(Visual Basic)
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
リスト7-2 縮小表示するための実装例(C#)
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に画像を表示します。

次のページ
表示部分にC1Bitmapを使う利点について

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6628 2012/06/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング