画像ファイルを開いて WriteableBitmap にデータを書きこむ

画像ファイルを開いてウインドウに表示するには、WriteableBitmap を経由すれば都合がいいです。それは WriteableBitmap には WritePixels() や CopyPixels() という高速にデータを扱える使いやすいメソッドがあるからです。これらは画像処理するのに非常に都合がいいメソッドです。

下記のコードは、

(0) ファイルに格納されたデータを単なるバイトデータ列として読み出しする。
(1) それを BitmapFrame クラスを用いて画像データとして意味づけをする。
(2) その意味付けされたデータを WriteableBitmap に書き込む。

という流れです。最終的に WriteableBitmap は XAML で定義済みの Image と関連付けられて、ウインドウに表示されることになります。

下記の名前空間の追加をお忘れなく.
using Microsoft.Win32;
using System.IO;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

// この using 追加を忘れずに. Don't forget to add this sentence.
using Microsoft.Win32;
using System.IO;

namespace aaa
{

	public partial class MainWindow : Window
	{

		WriteableBitmap Bmp000;

		public MainWindow()
		{
			InitializeComponent();
		}

		private void menuApplicationQuit_Click( object sender, RoutedEventArgs e )
		{
			// ウインドウを閉じてソフトを終了する.
			this.Close();
		}

		private void menuFileOpen_Click( object sender, RoutedEventArgs e )
		{

			// ファイルを開くダイアログを表示する.
			OpenFileDialog ofd = new OpenFileDialog();
			ofd.Filter = "ALL|*.*|BMP|*.bmp|PNG|*.png|JPEG|*.jpg";
			bool? ret = ofd.ShowDialog();
			if ( ret == false )
			{
				return; // warning.
			}

			// ファイルパスを取得する.
			String filepath = ofd.FileName;

			// ファイルから byte[] に単なるデータとして読み込む.
			byte [] data = File.ReadAllBytes( filepath );

			using ( MemoryStream ms = new MemoryStream( data ))
			{

				// 単なるデータ列を画像ビットマップ形式に再解釈する.
				BitmapSource bms = BitmapFrame.Create( ms );

				// 書き込み可能ビットマップだとなにかと使いやすい.
				Bmp000 = new WriteableBitmap( bms );

				ms.Close();

			}

			// イメージのサイズを画像と同じにする.
			image000.Width = Bmp000.PixelWidth;
			image000.Height = Bmp000.PixelHeight;

			// イメージに関連付ける.
			image000.Source = Bmp000;

			// タイトルバーにファイルパスを、ファイルのサイズを表示する.
			this.Title = String.Format( "{0} ({1}bytes)", filepath, data.Length );

		}

		private void menuFileSave_Click( object sender, RoutedEventArgs e )
		{
			MessageBox.Show( "NOP: menuFileSave_Click();" );
		}

	}
}

サンプルソースを用意しました。上記のコードのコピーペーストでうまく動かない場合にご利用ください。