System.Drawing.Image.FromFileを使うと簡単に画像ファイルを読み取ることが出来ます。
これは非常に簡単で一行で画像ファイルを読み込んでくれるのですが、ImageをDisposeするまで画像ファイルをロックしてしまいます。
これは非常に使いにくい。
ちなみにKBが出ています。
[PRB] PictureBox の Image プロパティにファイルを設定するとイメージ ファイルがロックされる
http://support.microsoft.com/default.aspx?scid=kb;ja;309482
で対策はFromStreamを使ってStreamを閉じろということです。
元の仕様は納得できるものではないのですが、対策は至極当然の方策です。
それを実装したものがWankuma.Drawing.Image.FromFileでした。
(http://blogs.users.gr.jp/naka/articles/2301.aspx)
ただしこの対策には実はわながありました。
マルチページTIFFというFAXでよく使われる形式があります。
この形式は1つのファイルに複数の画像を格納することが出来ます。
これのアクセス方法はかなり変わっていて
Guid[] DimensionList = img.FrameDimensionsList;
foreach(Guid dimens in DimensionList )
{
FrameDimension fd = new FrameDimension(dimens);
int Pages = img.GetFrameCount(fd);
for( int frameIndex = 0; frameIndex < Pages; frameIndex++ )
{
img.SelectActiveFrame(fd, frameIndex);
}
}
このようにimgインスタンスからFrameDimensionListを取得します。
このGUIDを利用してFrameDimensionを作成し、Dimensionを指定します。
さらに格納されているページ数を取得して、現在のページを切り替えるという操作です。
このSelectActiveFrameで実はロックしてあったファイルから画像を読み込んでいます。(推定)
System.Drawing.Image.FromFileを利用すると正常に動作するところが、Wankuma.Drawing.Image.FromFile(KBにある、ストリームを閉じるやり方)では、一般的なGDI+エラーが発生します。
ということは???
このKBの対策は実はしてはいけないということがわかります。
どういう対策をするかというと、新しいBitmap等のイメージにクローンを作成するということでしょうか?
しかし、完全なフレームまで再現させられるんだろうかちょっと自信ない(--;
でもやらなければね。
ということで続報があるかもっちゅうことで。