LoginSignup
2
1

More than 5 years have passed since last update.

ファイル1枚分のメモリで画像ファイル編集を行う

Last updated at Posted at 2017-02-19

画像ファイルを読み込み、画像編集して保存する場合に、プロセスで使用するメモリを最小限に抑える方法の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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1