#wp7dev_jp

写真にぼかしをかけてみます。blur エフェクトってやつです。

ある1点のぼかしをかけるときは、その周りの点を含めて平均をとって、その点のぼかし後の色が決まります。

image

平均をとる範囲が広いほど、ぼかしが大きくなります。

ではまずは定番のUI。

<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>

そして、コードです。

ここでは、Blur =2 として、点を中心に±2の範囲の平均をとっています。計25点の平均を各店に対して計算しています。

private void image1_Tap(object sender, GestureEventArgs e)
{
    WriteableBitmap wp = new WriteableBitmap(image1, null);
    int wpw = wp.PixelWidth;
    int wph = wp.PixelHeight;
    int blur = 2;
    for (int pixel = 0; pixel < wp.Pixels.Length; pixel++)
    {
        int ox = pixel % wpw;
        int oy = pixel / wpw;
        int count =0;
        int A =0;
        int R = 0;
        int G = 0;
        int B = 0;
        for (int y = -1 * blur; y <= blur; y++)
        {
            for (int x = -1 * blur; x <= blur; x++)
            {
                int tx = ox + x;
                int ty = oy + y;
                if ((tx >= 0) && (tx < wpw) && (ty >= 0) && (ty < wph))
                {
                    int color = wp.Pixels[tx + ty * wpw];
                    A += color >> 24;
                    R += (color >> 16) & 0x000000FF;
                    G += (color >> 8) & 0x000000FF;
                    B += (color) & 0x000000FF;
                    count++;
                }
            }
        }
        A /= count;
        R /= count;
        G /= count;
        B /= count;
        wp.Pixels[pixel] = ( A << 24 ) | ( R << 16 ) | ( G << 8 ) | B;
    }
    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;
    }
}

結果。

左から元画像、Blur=2、Blur=4、Blur=6、Blur=10。 だんだん処理時間が長くなります。Blur=10のばあい、1点の色を決めるのに400点の平均をとっているためです。

image image image imageimage

そんなわけで次は、ぼかしの間引き方です。