画像を描画

昔懐かしいグラフィックモードで画像を描画します。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. このプログラムは Windows 98 & Visual C++ ver 1.5 で作成しました。
    Visual C++ の現在のバージョンや、WindowsXP 以降では動かないかも知れません。
    グラフィックモードが動く環境が無くなりそうなので、今のうちに記録に残そうと取り上げました。
    グラフィックモードでイメージ画像を描画するのは簡単です。
    むしろこのモードで描画できるイメージ形式のファイル(*.IMG, *.RGB)を作成する方が大変です。
  2. イメージ形式のファイル(C_ENEMY.IMG)をオープンして buf[10000L] に格納します。
    C_ENEMY.IMG はコンソールモード独自の形式で、16色 BMP 形式から専用のプログラムで変換したものです。
    ネット上でも *.IMG を見かけることがありますが、ここで使っている形式とは異なります。
        char    buf[10000L];
    
        if ((FD= open("C_ENEMY.IMG",O_RDONLY|O_BINARY))==-1)
        {   printf("file open error\n"); return(1);  }
        if (read(FD,buf,10000L)==-1)
        {   printf("file read error\n"); close(FD); return(1);  }
        close(FD);
        
  3. Graphic Mode に切り替えて、イメージを描画します。
    イメージの描画は _putimage() 一行だけです。
    今回はパレットを設定していないので色は変ですが、イメージの形は解っていただけるでしょう。 (^_^;)
        //スクリーンの表示モードの設定
        if (!_setvideomode(_MAXRESMODE))    return(1);
    
        _putimage(100,50,buf,_GPSET);       //イメージを表示
        
  4. 画像の確認が終わると通常のモードに戻して終了します。
        _getch();                           //どれかキーを押すと終了
        _setvideomode(_DEFAULTMODE);
        return(0);
        
  5. 全ソースコードです。
    /*★ C言語のイメージファイルを表示する   前田 稔 ★*/
    #include <stdio.h>
    #include <graph.h>
    #include <io.h>
    #include <fcntl.h>
    
    int     FD;
    char    buf[10000L];
    
    /*★ MAIN PROGRAM ★*/
    int     main()
    {
        if ((FD= open("C_ENEMY.IMG",O_RDONLY|O_BINARY))==-1)
        {   printf("file open error\n"); return(1);  }
        if (read(FD,buf,10000L)==-1)
        {   printf("file read error\n"); close(FD); return(1);  }
        close(FD);
    
        //スクリーンの表示モードの設定
        if (!_setvideomode(_MAXRESMODE))    return(1);
    
        _putimage(100,50,buf,_GPSET);       //イメージを表示
    
        _getch();                           //どれかキーを押すと終了
        _setvideomode(_DEFAULTMODE);
        return(0);
    }
    

【NOTE】

C_ENEMY.IMG(IMG 形式) はコンソールモード独自の形式で、16色 BMP 形式から変換しました。

16色 BMP 形式

16色 BMP 形式は、1ドットが4ビットのピクセルごとに並んでいます。
BMP イメージの1ドットライン(20ドット分)
0000 3333 89AB CDEF 3210
16進数字の1文字(4ビット)が1個の点(ドット)に対応し、最初の4ドットが0番のパレットを、次の4ドットが3番のパレットを参照しています。

C言語のメモリイメージ

C言語のメモリイメージは、ドットラインごとに「青、緑、赤、輝度」の順に並べます。
0F55A0 0F33C0 000F00 00FF00
最初の3バイトが青色で、BMPでは2の0乗ビット(1のbit)に対応します。
次の3バイトが緑色で、BMPでは2の1乗ビット(2のbit)に対応します。
次の3バイトが赤色で、BMPでは2の2乗ビット(4のbit)に対応します。
最後の3バイトが輝度で、BMPでは2の3乗ビット(8のbit)に対応します。

また BMP 形式は画像の下側のドットラインから順に格納されています。
画像を正しく描画するには、画像に対応したパレットを設定しなければなりません。
私が作成した変換プログラムでは、画像形式の変換と同時にパレットファイル(*.RGB)も作成します。

超初心者のプログラム入門(C/C++)


BMP 画像をC言語のメモリイメージ形式に変換する