酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでPhotoChooserTaskを使ってピクチャーハブから静止画を取得する

概要

Windows Phone OS 7.0とOS 7.1で使用できます。アプリケーションからピクチャーハブのカメラロールやInternet Explorer等で保存した静止画、新たにカメラで撮影した静止画などを取得するセレクターです。

名前空間:Microsoft.Phone.Tasks

System.Object
 +--Microsoft.Phone.Tasks.ChooserBase<PhotoResult>
  +--Microsoft.Phone.Tasks.PhotoChooserTask

Tips

PhotoChooserTaskを使ってピクチャーハブから静止画を取得する

アプリケーションからピクチャーハブのカメラロールやInternet Explorer等で保存した静止画、新たにカメラで撮影した静止画などを取得するセレクターです。

PhotoChooserTaskクラスのShowメソッドを実行すると、ピクチャーハブのピクチャの選択ダイアログが表示されます。静止画画像の選択、またはユーザーによってキャンセルされると、Completedイベントハンドラが呼び出しされ、静止画取得に成功したかどうかを判断することが出来ます。

選択後の画像をページ上に表示しますのでXAMLから定義します。button1をクリックするとカメラアプリケーションが実行され、撮影完了後にimage1に表示します。

<phone:PhoneApplicationPage 
    x:Class="PhotoChooserTaskTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot は、すべてのページ コンテンツが配置されるルート グリッドです-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel は、アプリケーション名とページ タイトルを格納します-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="SOFTBUILD" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="SavePhoneNumberTask Test" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" FontSize="64" />
        </StackPanel>

        <!--ContentPanel - 追加コンテンツをここに入力します-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Button Content="Button" Height="72" HorizontalAlignment="Center" Name="button1" VerticalAlignment="Center" Width="450" Click="button1_Click" />
            <Image x:Name="image1" Height="269" VerticalAlignment="Top"/>
        </Grid>
    </Grid>

</phone:PhoneApplicationPage>
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace PhotoChooserTaskTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e) {
            var task = new PhotoChooserTask();
            task.Completed += new EventHandler<PhotoResult>(task_Completed);
            try {
                task.Show();
            } catch (InvalidOperationException ex) {
                MessageBox.Show(ex.Message);
            }
        }

        void task_Completed(object sender, PhotoResult e) {
            if (e.TaskResult == TaskResult.OK && e.ChosenPhoto != null) {
                // 画像取得に成功
                var bmpImage = new BitmapImage();
                bmpImage.SetSource(e.ChosenPhoto);
                image1.Source = bmpImage;
            } else if (e.TaskResult == TaskResult.Cancel && e.Error == null) {
                // ユーザーによって取得をキャンセルされた
            } else {
                // 画像の取得に失敗した(Zune Softwareが接続されていたなど)
            }
        }
    }
}

Windows Phone Emulatorではサンプル画像がいくつか用意されています。デバッグにはこれらの画像を使用すると良いでしょう。アカウントの紐付けが終わっている実機の場合、FacebookやWindows Liveにアップロードしたアルバムから写真を選択することが出来ます。

f:id:ch3cooh393:20150511132049p:plain

いずれかの写真を選択すると静止画画像のストリームを得ることが出来ます。このストリームをソースにBitmapImageインスタンスを生成し、Imageへ設定します。

新規にカメラアプリでの撮影を許可する

新規にカメラ撮影を許可したい場合は、ShowCameraプロパティをtrueに設定します。下図の通り、ピクチャの選択ダイアログのアプリケーションバー部分にカメラボタンが表示されます。

f:id:ch3cooh393:20150511132115p:plain

カメラボタンをタップすることでカメラを起動し、CameraCaptureTaskと同様に静止画撮影を行います。ユーザーに新たにカメラを使って撮影させたくない場合は、このプロパティはfalseに設定しておくと良いでしょう。

private void button1_Click(object sender, RoutedEventArgs e) {
    var task = new PhotoChooserTask();
    task.Completed += new EventHandler<PhotoResult>(task_Completed);
    try {
        // 新規にカメラ撮影を許可する(true = 表示)
        task.ShowCamera = true;
        task.Show();
    } catch (InvalidOperationException ex) {
        MessageBox.Show(ex.Message);
    }
}
選択した写真をトリミングする

選択した写真をトリミングしたい場合、PixelWidthプロパティおよびPixelHeightプロパティにサイズを指定します。

f:id:ch3cooh393:20150511132139p:plain

private void button1_Click(object sender, RoutedEventArgs e) {
    var task = new PhotoChooserTask();
    task.Completed += new EventHandler<PhotoResult>(task_Completed);
    try {
        // 選択した写真をトリミングしたい場合、サイズを指定する
        task.PixelWidth = 320;
        task.PixelHeight = 240;
        task.Show();
    } catch (InvalidOperationException ex) {
        MessageBox.Show(ex.Message);
    }
}