写真をセピアに

#wp7dev_jp

白黒写真にする応用です。

まずは画面、Imageコントロールを張り付けて、メニューを追加。

 <Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid x:Name="ContentPanel" >
        <Image Name="image1" Stretch="UniformToFill" Tap="image1_Tap" />
    </Grid>
</Grid>
 
<!--ApplicationBar の使用法を示すサンプル コード-->

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBar.MenuItems>
            <shell:ApplicationBarMenuItem Text="読み込み" 
              Click="ApplicationBarMenuItem_Click" />
        </shell:ApplicationBar.MenuItems>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

そしてコード。

カギになるのは image1_Tapの中の処理。セピアにするには黄土色(C29670) の色と各ピクセルを比較して、ピクセルがこの色よりも白っぽかったらこの色に変更するというやり方。白っぽいところが色あせて、セピアになります。

 using Microsoft.Phone.Tasks;
public partial class MainPage : PhoneApplicationPage
{
    // コンストラクター
    public MainPage()
    {
        InitializeComponent();
    }
    private void image1_Tap(object sender, GestureEventArgs e)
    {
        WriteableBitmap wp = new WriteableBitmap(image1, null);
        uint filter = 0xFFC29670;
        byte fR =  (byte)((filter & 0x00FF0000) >> 16);
        byte fG =  (byte)((filter & 0x0000FF00) >> 8);
        byte fB = (byte)(filter & 0x000000FF);
        for (int pixel = 0; pixel < wp.Pixels.Length; pixel++)
        {
            int color = wp.Pixels[pixel];
            byte A = (byte)((color & 0xFF000000) >> 24);
            byte R = (byte)((color & 0x00FF0000) >> 16); 
            R = (R > fR) ? fR : R;
            byte G = (byte)((color & 0x0000FF00) >> 8);
            G = (G > fG) ? fG : G;
            byte B = (byte)(color & 0x000000FF);
            B = (B > fB) ? fB : B;
            color = (A << 24) | (R << 16) | (G << 8) | B;
            wp.Pixels[pixel] = color;
        }
        image1.Source = wp;
    }
    private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
    {
        PhotoChooserTask task = new PhotoChooserTask();
        task.Completed += new EventHandler<PhotoResult>(task_Completed);
        task.Show();
    }
    void task_Completed(object sender, PhotoResult e)
    {
        if (e.TaskResult == TaskResult.OK)
        {
            BitmapImage bmp = new BitmapImage();
            bmp.SetSource(e.ChosenPhoto);
            image1.Source = bmp;
        }
    }
}

実行結果。画像を読み込んだところと、画面をタップしてフィルタをかけたところ。

image image

ね、簡単でしょ?