最近仕事で「マルチTiffの枚数を数える」ってなミッションがありました。
最初は .NET の「Image.FromFile」を使ったやりかたでやってたんです(詳細はググってください)
ところがこいつには問題がありまして、
「GDI+のサポートしていないフォーマットだと、OutOfMemoryExceptionを返す」
ってな動きがあります。
なにが問題かといいますと、
「TiffのJpeg圧縮をサポートしていない」
ことなんです。
最近のカラースキャナでカラー読み込みすると、多くが
「Tiff、Jpeg圧縮、24bitカラー」
になるみたいです。
他にLZW圧縮って方式があるんですが、標準ではあまり使われない&読み込み方式として選択できないものが多い模様(XロックスとかKセラとかCノンとかは選択できなかった)
すると、Image.FromFileを使ったやり方だと例外をはいてしまい、マルチTiffの枚数がとれないわけです。
で。
結局、
Tiff6.0の仕様から中身の構成を確認して、
1、ファイルをStreamで開く
2、バイトオーダーをチェック(IntelかMotorola。リトルエンディアンかビッグエンディアンかと同義と思ってる)
3、IFD(ImageFileDirectory)の数を数える
ってなプログラムを組んでマルチTiffの枚数を取得することに成功しました。
ファイル構成は先ほどの
Tiff仕様と、
こちらを参考に勉強させてもらいました
注意点としては、IFDは本来は複数の情報を含めることができるので、正確には
「1ファイル情報≠1IFD」
ってことでしょうか。
※常用的に「1ファイル情報=1IFD」となっているようですが
この処理、StopWatchで計測したら、0.2ミリ秒くらいで終わってました。ほんまかいな(苦笑)
まぁ、はじめのバイト数えて、IFDのポインタ情報に従って次へ次へいくだけなので、それほどの時間にはならないからあってるのかも。
P.S.
やっぱり、こういうのは覚えてる間に書かないとダメですなぁ
前に.NET Compact Framework でやった、疑似Validationは正確なやり方忘れちゃったから、再度やってと言われても思い出せない(^^;;