Jpegファイルとメモリストリームの操作

.netでは、ファイルやメモリ、ネットワーク上のデータをストリームとして同じような感覚で扱うことができます。読み書きする媒体を指定してストリームを開いたら、あとはReadしたりWriteしたりして閉じるだけ。ビットマップなど標準のコンポーネントもストリームからのデータ読み込みに対応しているものがあるので、データがどこにあるかをあまり意識することなく(各種ストリームを抽象化したStreamクラスで読み書きできる)プログラムを書くことができて便利ですね。

 今回は、このストリームからのデータ読み込みの流れを掴むために、「Jpegファイルをバッファに読み込んでメモリストリームを作成し、そのメモリストリームからBitmapを作成する」処理を試してみました。

ストリームからのJpegイメージ読み込み

 まず、Jpegファイルをバッファに読み込む処理はFileStreamを使います。このストリームで、byte配列にJpegイメージのデータを読み込んで、その配列からMemoryStreamを生成、さらにそのMemoryStreamBitmapを生成、というのが今回のプログラムの流れです。
 単に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ファイルの内容がフォームのクライアント領域全体に描画されます。