Jpegファイルとメモリストリームの操作
.netでは、ファイルやメモリ、ネットワーク上のデータをストリームとして同じような感覚で扱うことができます。読み書きする媒体を指定してストリームを開いたら、あとはReadしたりWriteしたりして閉じるだけ。ビットマップなど標準のコンポーネントもストリームからのデータ読み込みに対応しているものがあるので、データがどこにあるかをあまり意識することなく(各種ストリームを抽象化したStreamクラスで読み書きできる)プログラムを書くことができて便利ですね。
今回は、このストリームからのデータ読み込みの流れを掴むために、「Jpegファイルをバッファに読み込んでメモリストリームを作成し、そのメモリストリームからBitmapを作成する」処理を試してみました。
ストリームからのJpegイメージ読み込み
まず、Jpegファイルをバッファに読み込む処理はFileStreamを使います。このストリームで、byte配列にJpegイメージのデータを読み込んで、その配列からMemoryStreamを生成、さらにそのMemoryStreamでBitmapを生成、というのが今回のプログラムの流れです。
単にJpegファイルからBitmapを作るだけなら、Bitmapのコンストラクタにファイルパスを渡せばよいんですけどね。ただ、今回のプログラムは「ファイルではなくメモリ上のJpegイメージ」を扱う実験も兼ねているので、ストリームの連携を確認する意味でもこのような流れにしてみました。
実際にJpegファイルtest.jpgをバッファに読み込み、そのバッファのデータからBitmapを生成する流れは、以下のようになります。
/* ファイルストリーム生成 */
FileStream fs = new FileStream("test.jpg", FileMode.Open);
/* データ格納用バッファ生成 */
byte[] abyData = new byte[fs.Length];
/* バッファにデータを読み込む */
fs.Read(abyData, 0, (int)fs.Length);
fs.Close();
/* データを格納したバッファからMemoryStream生成 */
MemoryStream ms = new MemoryStream(abyData);
/* ストリームからBitmap生成 */
m_bmp = new Bitmap(ms);
ms.Close();
プログラム
実行ファイルと同じディレクトリにtest.jpgの名で適当なJpegファイルを置いたら、実行してみてください。test.jpgファイルの内容がフォームのクライアント領域全体に描画されます。