■ 新・ゲーム開発講座 |
■ へっぽこプログラミング入門♪ |
■第57夜:JPEGを読む 今回は、ちょっと公開すべきか迷ったのですがJPEGを読む機能を追加します。 ■OleLoadPicture()とは? Windowsの開発初期の頃、複数のアプリケーション間でデータを共有しようという目的でOLE (Object Linking and Embedding)という仕組みが考案されました。今では発展?してActive-Xにつながっているようですが、くににんには解説するだけの知識はありません(をい ^^;)。ふーん、コンポーネントがいっぱいあるのか〜COMっていうのか〜ふにゃふにゃ…ぐう(まて) OleLoadPicture() はその中でお手軽に画像を読み込む関数です。どのへんがお手軽なのかといいますと、この関数ひとつで BMP、JPEG、GIF が読めてしまうのです。 OLEAUT32.DLL に依存しており、このDLLは Windowsをインストールすれば標準でシステムフォルダに入っているのですが、IEやEXCELをインストール/アップデートするとそのたびに書き換えられて妖しげな機能が付加されているのだとか。Win98以降はそれなりに安定しているそうですが、システム上の自分以外のプログラムもこのDLLを参照して動作している可能性がある、ということは頭のどこかに置いておいたほうが良いかもしれません。 ところで OleLoadPicture() を利用するには、IStremとIPictureインターフェースとやらを作らねばなりません。が、これもくににんにはオーパーツなので使い方がわかればそれでいいや…と割り切ります。 BMPを読むコマンドとしては既に第21夜で #g_load コマンドを作りました。ここではそれを改造してJPEGも読めるようにしてしまいましょう。
■コマンド実行部 Text_Com_01.cpp
の Com_g_load() に手を加えます。従来 Load_Bmp() で画像を読んでいたところを、これから作成するJPEGロード関数で置き換えます。 |
int Com_g_load() {
|
■Jpeg Loader さてそれでは肝心のJPEGローダの部分です。まずはリスト(g_tool.cpp)から。 |
//========================================================= #include <ocidl.h> //←IPictureの定義 bool _check_g_filename( char *f_name
) //ファイル名チェック
void HLS_LoadJpeg( HDC dest_DC,int
x,int y, char *f_name )
|
さてそれでは簡単にオーパーツの使い方を♪ で、せっかく読めてもそれがメモリのどこかにひっそりと存在しているのでは意味がありません。get_Height()、get_Width()で高さと幅を求め、get_Handle()で取得したハンドルでDCを作成し、外部の(ここでは関数の引数として渡される dest_DC の)画面にBitBlt()でコピーしてしまいます。その後 IStream、IPicture を破棄してファイルを閉じます。 さて、実行してみると…おお、たしかにJPEGが読めます(^^;) これで、なにか作品を作ってネットで配布しようという場合でもずいぶん助かりそうですね。 |
|
ところで、こういうワザができるとシステムメニューやデフォルトの背景画など、すべてをJPEG化したくなるのが人情というものですが…実はくににんは推奨しません。メニュー窓の表示などは、明らかにレスポンスが悪化します。また Load_Bmp() と 今回作成した HLS_LoadJpeg() で比較すると、内部で LoadImage() を使用している Load_Bmp() のほうが明らかに良いパフォーマンスを示します。OleLoadPicture()は便利ではありますが、速度の点では不利なようです。 そのような次第で、今回作成したJpegローダ HLS_LoadJpeg()
で画像読み込み部を置き換えるのは、プログラム内では
の2箇所に絞ります(具体的にどこを直したかはソースを見てください ^^)。 またこのお陰で、フォルダ GDAT (画像ファイルを入れておく場所) に格納する画像ファイルについて、BMPとJPGが入り乱れる可能性が出てきたので、簡単なルールを決めておきましょう。
このあたりの使い分けは、プログラマのセンスによってずいぶん違った価値観で判断される部分もあろうと思います。面倒だからどちらかに統一しろ、という主張もあるかもしれません。しかしくににん的には、@速度に優れるがBMPしか読めない、AJPEGも読めるが速度は遅い という2つの手段が使えるのであれば、それぞれに適した場所で使い分ければよいだけだと思うわけです。まあ人好き好きというのもあるでしょうから、皆さんなりに考えてみてください。 …とゆーか、IStreamはもう少しちゃんと勉強しなきゃダメぴょんですね(汗汗汗 ^^;) |