X11プロがラミングとは

X ウィンドウ上で動作するプログラムに,お絵描きツールのような画像を作成,編集するエディタ bitmap がある.この bitmap を利用して,ある2値(ビット単位で値0と1からなる)のイメージ描き,ファイルに保存する.これをビットマップファイルと呼ぶ.保存されたビットマップファイルを読込んで,ウィンドウに表示するプログラムを作成しててみよう.

ソースコード

源文件
  1|/* rdbitmap.c */
  2|
  3|#include <X11/Xlib.h>    // X-Window 関係のヘッダファイルのインクルード                    
  4|#include <X11/Xutil.h>   // X-Window 関係のヘッダファイルのインクルード                    
  5|#include <stdio.h>
  6|
  7|int main(void){
  8|  Display     *d;        // Display 構造体                                                 
  9|  Window       w;        // ウィンドウ識別子 w                                             
 10|  GC           gc;       // グラフィックス属性 GC 職別子 gc                                
 11|  Pixmap       bitmap;   // ピックスマップ識別子 bitmap                                    
 12|  XEvent       event;    // XEvent 構造体                                                  
 13|  unsigned int width, height;
 14|  int          x_hot, y_hot;
 15|
 16|  char fname[20];
 17|
 18|  printf("\n*Enter bitmap file name ?");   // bitmap ファイルのファイル名入力              
 19|  scanf("%s", fname);
 20|
 21|  d = XOpenDisplay(NULL);                  // Display との接続要求                         
 22|                                           /* Window 生成,位置はルートウィンドの           
 23|                                              座標(100,100),大きさ96(幅)x48(高さ),         
 24|                                              枠幅:0,枠表示色:黒,ウィンドウ本体:白 */
 25|  w = XCreateSimpleWindow( d, RootWindow(d,0), 100, 100,                                   
 26|                           96, 48, 0, 1, 0);
 27|
 28|  XSelectInput ( d, w, ExposureMask );     // Expose イベントを選択するためのマスク指定    
 29|
 30|  XMapWindow(d, w);                        // Window を可視状態にする                      
 31|
 32|  gc = XCreateGC( d, w, 0, 0 );            // グラフィック属性 GC の要求                   
 33|  XSetForeground ( d, gc, BlackPixel(d,0) );   // 前景色を黒に指定                         
 34|  XSetBackground ( d, gc, WhitePixel(d,0) );   // 背景色を白に指定                         
 35|
 36|                                           /* bitmap ファイルを読込む                      
 37|                                              bitmap を生成する*/
 38|  XReadBitmapFile( d, w, fname, &width, &height,
 39|                   &bitmap, &x_hot, &y_hot );
 40|
 41|  while (1) {                              // 無限ループに入る                             
 42|    XNextEvent ( d, &event );              // イベントの取得                               
 43|    switch ( event.type ) {
 44|    case Expose :
 45|                                           /* Expose イベントのとき,bitmap                
 46|                                              を Window に複写し,可視にする */
 47|      XCopyPlane( d, bitmap, w, gc,
 48|                  0, 0, width, height, 0, 0, 1 );
 49|      XFlush(d);
 50|    }
 51|  }
 52|  return 0;
 53|}

コンパイル

% gcc -Wall -O2 -o rdbitmap rdbitmap.c -lX11

つぎに表示するイメージ,即ちプログラム rdbitmap の入力ファイルとなるビットマップファイルを作成する.ビットマップファイルは,エヂィタ bitmap で作成する.

% bitmap -size 32x24 

エディタ bitmap の size パラメータで指定した値は,作成するビットマップの幅(width),高さ(Height)が各々32,24ドットである.

下記の画面のように自由なイメージを描画する.編集が終了したら,左上の"File"をクリックし,プルダウンメニューから"Save as "をクリックすると,"Save file"ウィンドウが現れる.ファイル名 bitmap01.bmp を入力し,続いて"OK"をクリックする.再度プルダウンメニューから"Quite"を選択して,bitmapを終了させる.

bitmap01

実行結果

% ./rdbitmap  

*Enter bitmap file name ?bitmap01.bmp

上のコマンドを入力すると,下記のウィンドウが表示される.

bitmap01

次に,ワークステーションと X11 プログラミングの理解を深めために,プログラム rdbitmap.cの内容を見てみよう.

  1. サーバディスプレイとの接続確立
  2. ウィンドウの生成と配置
  3. グラフィックスコンテキスト(CG)の生成
  4. ビットマップファイルの読込み
  5. ビットマップの生成
  6. 日とマップのウィンドウへの複写
  7. ウィンドウのデータをウィンドウに表示

である.これらの各々の手続き,即ち利用するXの資源や呼び出す関数の種類,順序などは,画像処理の目的によって異なる.

つぎに画像処理プログラミングのために,入力対象となった画像データファイルのフォーマット(記憶形式)について,正しく理解しておく必要がある.プログラム rdbitmap の入力ファイルとして指定した画像データのフォーマットを調べてみよう.

% cat bitmap01.bmp 
#define bitmap01_width 32
#define bitmap01_height 24
static unsigned char bitmap01_bits[] = {
   0xf8, 0x00, 0x00, 0x00, 0x04, 0x01, 0xf8, 0x00, 0x02, 0x02, 0x06, 0x03,
   0x01, 0x84, 0x01, 0x0c, 0x01, 0x44, 0x00, 0x10, 0x01, 0x44, 0x00, 0x10,
   0x01, 0x24, 0x00, 0x20, 0x01, 0x24, 0x00, 0x20, 0x02, 0x12, 0x00, 0x40,
   0x04, 0x11, 0x00, 0x40, 0xf8, 0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40,
   0x00, 0x10, 0x00, 0x40, 0xfc, 0x21, 0x00, 0x20, 0x02, 0x22, 0x00, 0x20,
   0x01, 0x44, 0x00, 0x10, 0x01, 0x44, 0x00, 0x10, 0x01, 0x84, 0x01, 0x0c,
   0x01, 0x04, 0x06, 0x03, 0x01, 0x04, 0xf8, 0x70, 0x01, 0x04, 0x00, 0x88,
   0x01, 0x04, 0x00, 0x88, 0x02, 0x02, 0x00, 0x88, 0xfc, 0x01, 0x00, 0x70};

Chapter1 @ X11による画像処理 @ HomeWorkList @ 昭亮'sHomepage