WPF Erase

WriteableBitmap を使って画像からピクセル単位に消去します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. WriteableBitmap を使うとピクセル(ドット)単位の演算を行うことが出来ます。
    ImageBox に描画した画像からマウスのクリックでピクセル単位に消去します。
    [ファイル][新規作成][プロジェクト]から[Visual C#][Windows][WPF アプリ(.NET Framework)]を選んで下さい。
    プロジェクトの作成は C# Store Application を参照して下さい。
  2. MainWindow.xaml を直接編集して、画像サイズに合わせて ImageBox を定義します。
    名前を "image" に設定して下さい。
        <Grid>
            <Image x:Name="image" HorizontalAlignment="Left" Height="120"
                Margin="100,60,0,0" VerticalAlignment="Top" Width="240"/>
    
        </Grid>
    
  3. MainWindow.xaml.cs で WriteableBitmap wb; と BitmapImage m_bmp; を定義します。
    Constructor から My_Image(); 関数を呼び出して画像を ImageBox に描画します。
    マウスクリックのイベントハンドラ(OnMyMouseDown) を設定します。
        public partial class MainWindow : Window
        {
            private WriteableBitmap wb;
            BitmapImage m_bmp;
            public MainWindow()
            {
                InitializeComponent();
                My_Image();
                MouseDown += new MouseButtonEventHandler(OnMyMouseDown);
            }
    
  4. My_Image(); 関数では "c:\\data\\test\\ffx2s.jpg" をロードして image.Source = m_bmp; で ImageBox に設定します。
    wb = new WriteableBitmap(m_bmp); で WriteableBitmap を生成します。
            private async void My_Image()
            {
                m_bmp = new BitmapImage();
                m_bmp.BeginInit();
                m_bmp.UriSource = new Uri("c:\\data\\test\\ffx2s.jpg");
                m_bmp.EndInit();
                image.Source = m_bmp;
                wb = new WriteableBitmap(m_bmp);
            }
    
  5. マウスのクリックで OnMyMouseDown() 関数が呼び出されます。
    マウスがクリックされた座標を point に取得して、ImageBox の座標に変換します。
    xp, yp をタイトルバーに印字して確認しています。
    xp, yp が ImageBox の外であれば何もしません。
    rect で xp, yp の矩形(1ピクセル)を設定して WritePixels() 関数で ColorData(黒) を書き込みます。
    image.Source = wb; で ImageBox に描画します。
            void OnMyMouseDown(object sender, MouseEventArgs e)
            {
                Point point = e.GetPosition(this);
                int xp = (int)point.X-100;
                int yp = (int)point.Y-60;
                string str = xp.ToString() + " : " + yp.ToString();
                this.Title = str;
                if (xp<0 || xp>=240)    return;
                if (yp<0 || yp>=120)    return;
                byte[] ColorData = { 0, 0, 0, 0 }; // B G R
                Int32Rect rect = new Int32Rect(xp, yp, 1, 1);
                wb.WritePixels(rect, ColorData, 4, 0);
                image.Source = wb;
            }
        }
    }
    
  6. 開始ボタン(右三角)でコンパイルして実行すると "ffx2s.jpg" がウインドウに描画されます。
    マウスをクリックした座標のピクセルが黒くなります。
    1ピクセルの小さな点なので、繰り返しクリックして注意深く見つめて下さい。
    WPF では Windows10 のスタート画面にアプリが自動的に登録されることはありません。

超初心者のプログラム入門(C# Frame Work)