画像ファイルを開いて 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();" );
}
}
}
サンプルソースを用意しました。上記のコードのコピーペーストでうまく動かない場合にご利用ください。
画像ファイルを開いて WriteableBitmap にデータを書きこむ
1 ファイル 11 KB