potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C# Image.FromFileの代替法とその短所

C#のImage.FromFileメソッドは戻り値のImage型オブジェクトが解放されるまでファイルがロックされる仕様が知られています。 この仕様を回避するため、File.OpenメソッドとImage.FromStreamメソッドを組み合わせた代替法が知られています。この代替法を使用した場合、ファイルをロックせずに画像を表示することができますが、GIFファイルを表示した場合はエラーが発生します。原因は以下の通りと想像します。

C#のImageクラスはGIF画像を表示するときにFromFileメソッドでロックしているファイルを参照するが、FromStreamメソッドで読み込んだデータは保持あるいは参照しない。

したがって、ImageクラスでGIFファイルを扱う可能性がある場合、素直にImage.FromFileメソッドを使用して適切にDisposeするか、File.OpenメソッドとImage.FromStreamメソッドの間にMemoryStreamクラス(ファイル内容の全読み込み及び保持)を挟むかを選択することができます。両者の違いはファイルのロックとメモリ使用量の大小、MemoryStreamの扱い方によってはガベージコレクタへの依存度なので、目的に応じた使い分けが必要と考えられます。