画像展開プログラム
 
 

■ 最も簡単な展開方法

 ERI フォーマットの画像ファイルを読み込んで復元する最も簡単な方法は、ERIAnimation クラスを使用することです。
 ERIAnimation クラスは、動画像を再生するクラスですが、静止画像を再生することもできます。音声を再生する場合には、このクラスを派生して使う必要がありますが、静止画像には当然音声は含まれませんから、このクラスがそのまま使えます。

 静止画に限って言うなら使用方法はいたって簡単です。
 まず、読み込みたいファイルを開きます。
 次に、ERIAnimation::Open 関数で画像ファイルを開きます。この関数が成功すると、画像は既に展開できています。
 画像データは、GetImageInfo 関数で取得できます。
 これをプログラムにすると以下のようになります。

EReadFile       file ;
if ( !file.Open( filename ) )
{
    // エラー:ファイルを開けなかった
}
ERIAnimation    eriani ;
if ( !eriani.Open( &file ) )
{
    // エラー:読み込めないフォーマット
}
const RASTER_IMAGE_INFO * prii ;
prii = eriani.GetImageInfo( ) ;
 見てのとおり、とても簡単です。
 しかし、この方法には欠点もあります。
 あくまでアニメーション用のクラスなので余計なリソースを消費することなどがありますし、特に問題になるのが、展開状況の通知ができないことでしょう。
 これは、画像のローダーなどで、展開状況を表示できないことを意味しており、少々勝手が悪いと言えるでしょう。
 

■ 柔軟な展開方法

 ERIAnimation クラスでは、上に書いたとおり、簡単に画像を読み込むことができますが、今ひとつ使い勝手が良くありません。
 そこで、もっと低水準なクラスを利用して画像を読み込む方法があります。
 これには、ERI ファイルフォーマットへのインターフェースを供給する ERIFile クラス、圧縮されたビットストリームへのインターフェースを供給する RLHDecodeContext クラス、圧縮された画像データへのインターフェースを供給する ERIDecoder クラスを利用します。

 具体的にどのようにするかと言うと、まず、読み込みたいファイルを開きます。
 これは、ERIAnimation クラスを使う場合と同じです。
 次に、ERIFile::Open 関数で、ERI ファイルへのインターフェースを開きます。

ERIFile    erif ;
if ( !erif.Open( &file ) )
{
    // エラー:不正なERIファイル
}
 ERIFile::Open 関数が成功した時点で、ERI ファイル内の画像データレコードが開かれた状態になっています。
 ERI ファイルを開いたら次に、ビットストリームへのインターフェースを開きます。
EFileDecodeContext    context( &erif, 0x10000 ) ;
 EFileDecodeContext クラスは、RLHDecodeContext クラスから派生したクラスで、ファイルから読み込む機能を持ったクラスです。
 構築関数の1つ目の引数には EFileObject へのポインタを指定します。2つ目の引数には、中間バッファのバイト数を指定します。これは、この例の場合、ファイルから何バイト単位でデータを読み込むかを指定するものです。
 次に、ERIDecoder クラスに、context を渡して画像データを復元させます。
ERIDecoder    decoder ;
if ( decoder.Initialize( erif.m_nInfoHeader ) )
{
    // 対応していないフォーマット
}
RASTER_IMAGE_INFO    rii ;
// rii には展開した画像を受け取るバッファを設定する
if ( decoder.DecodeImage( rii, context, false ) )
{
    // 展開に失敗
}
 これで、rii に指定したバッファに画像データを受け取ることができます。

 …さて、ところで、これじゃあ、ERIAnimation と同じで、展開状況を知ることができないじゃないかと思われるかもしれません。
 そうです。展開状況を知るには、ERIDecoder クラスを派生させる必要があります。
 派生したクラスで、OnDecodedBlock 関数と、OnDecodedLine 関数をオーバーライドすることによって展開状況を知ることができます。
 これの詳細は、ERINA-Library に同梱のサンプルプログラム、ericvt 参考にするのが良いでしょう。

 こういう、少々煩雑とも思える画像の読み込み方法を採用する利点はいくつかあります。(しかし、たいていの場合、上記の例で事足りるでしょうが)
 まず、完全なファイルフォーマットで画像データが提供されなくても良いと言えます。(ファイルイメージがメモリ上にある場合、ERIAnimation クラスで読み込めます)
 例えば、画像のヘッダ情報と圧縮された生の画像データのみがある場合でも、上記の方法で展開できます。
 また、画像ファイルに含まれる付加的な情報(コメントや著作権情報)を取り出すこともできます。
 他に、ストアする画像データのフォーマットを直接的に指定することができます。
 これはどういうことかというと、ERIAnimation クラスで画像を展開した場合、ERIAnimation クラスで規定された画像フォーマット(Windows の DIB 形式に準拠する画像配列)で画像が渡されるので、例えば、1つのピクセルの中の RGB の並び方を変えるとなると、一旦展開したデータを変換する操作が必要になります。
 一方、ERIDecoder クラスを派生すれば、好きな RGB のビット配列で直接メモリにストアできます。

 

戻る