画像ファイルを読み込み、画像編集して保存する場合に、プロセスで使用するメモリを最小限に抑える方法の1つについてまとめる。
処理のフローは以下の通り。
①FileStreamクラスで編集対象の画像ファイルを読み込む
②画像処理用にBitmapクラスを作成する
③Graphicsクラスで任意の画像処理を行う
④画像処理の内容を①のFileStreamクラスが見えるメモリに反映する
⑤ファイルを保存する
実際のコードは以下のようになる。
Bitmap bitmap = null;
/* ①FileStreamクラスで編集対象の画像ファイルを読み込む(このSTEPではファイルは読み込まれない) */
using ( FileStream bitmapStream = new FileStream( *画像ファイルのパス*, FileMode.Open, FileAccess.ReadWrite, FileShare.None ) )
{
/* ②画像処理用にBitmapクラスを作成する(ここでStreamとあわせて1枚ぶんの画像が読み込まれる) */
bitmap = new Bitmap( bitmapStream ) as Bitmap;
/* ③Graphicsクラスで任意の画像処理を行う */
using ( Graphics bmpGraphics = Graphics.FromImage( bitmap ) )
{
bmpGraphics.FillRectangle( System.Drawing.Brushes.Black, new RectangleF( 0, 0, 1000, 1000 ) );
}
/* ④画像処理の内容を①のFileStreamクラスが見えるメモリに反映する */
bitmap.Save( bitmapStream, bitmap.RawFormat );
bitmapStream.Seek( 0, SeekOrigin.Begin );
/* ⑤ファイルを保存する(FileStreamのcloseをもって反映) */
}
bitmap.Dispose();
別名保存や別形式保存する場合は「⑤ファイルを保存する」を以下のように書き換える。
/* ⑤ファイルを保存する(別名保存) */
BitmapFrame bmpFrame = BitmapFrame.Create( bitmapStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None );
using ( FileStream fileStream = new FileStream( *画像ファイルのパス*FileMode.Create, FileAccess.ReadWrite, FileShare.None ) )
{
BmpBitmapEncoder bitmapEnocder = new BmpBitmapEncoder();
bitmapEnocder.Frames.Add( bmpFrame );
bitmapEnocder.Save( fileStream );
}
この場合①のオープン属性はReadのみにしておく。
確認環境は下記の通り。
OS:Windows 10 Home 64-bit
Language: Japanese
CPU:Intel(R) Core(TM) i3-3227U CPU @ 1.90GHz (4 CPUs), ~1.9GHz
Memory:4096MB RAM
.NetFrameWork:4.5.2
Visual Studio:Community 2015