WPF Color

WriteableBitmap を使って画像を減色して描画します。

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

プログラムの説明

  1. WriteableBitmap を使うとピクセル(ドット)単位の演算を行うことが出来ます。
    ImageBox に描画した画像から赤の要素を削除します。
    [ファイル][新規作成][プロジェクト]から[Visual C#][Windows][WPF アプリ(.NET Framework)]を選んで下さい。
    ポインターを使うので[プロジェクト]メニューの[プロパティ]から[ビルド]を選択して[unsafe コードブロックの許可]を設定します。
    プロジェクトの作成は C# Store Application を参照して下さい。
  2. MainWindow.xaml を直接編集して、画像サイズに合わせて ImageBox を定義します。
    名前を "image" に設定して下さい。
        <Grid Margin="0,10,0.333,-10.333">
            <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 に設定します。
            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;
            }
    
  5. マウスのクリックで OnMyMouseDown() 関数が呼び出されます。
    wb = new WriteableBitmap(m_bmp); で WriteableBitmap を生成します。
    WriteableBitmap を使うとピクセル(ドット)単位の演算を行うことが出来ます。
    画像全体から赤色(p[2] = 0;)の要素を無くします。
    image.Source = wb; で WriteableBitmap を ImageBox に設定します。
            void OnMyMouseDown(object sender, MouseEventArgs e)
            {
                wb = new WriteableBitmap(m_bmp);
                wb.Lock();
                unsafe
                {
                    byte* ptr = (byte*)wb.BackBuffer;
                    for (int y = 0; y < wb.PixelHeight; y++)
                    {
                        for (int x = 0; x < wb.PixelWidth; x++)
                        {
                            byte* p = ptr + (y * wb.BackBufferStride) + (x * 4);
                            p[2] = 0;   //R=0
                        }
                    }
                }
                wb.AddDirtyRect(new Int32Rect(0, 0, wb.PixelWidth, wb.PixelHeight));
                wb.Unlock();
                image.Source = wb;
            }
        }
    
  6. 開始ボタン(右三角)でコンパイルして実行すると "ffx2s.jpg" がウインドウに描画されます。
    マウスをクリックすると画像から赤色の要素が削除されます。
    WPF では Windows10 のスタート画面にアプリが自動的に登録されることはありません。

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