☆画像を表示してみよう


○ウィジットを探す

何かしようとした時,Gtk+ではそのウィジットを使うのかを決める必要がある。

・gdk_pixmap_create_from_xpm関数
 画像をファイルから読み込んで表示する

・gdk_pixmap_create_from_xpm_d関数
 画像をデータ指定して表示する

の2種類があるようだ。

とりあえず,簡単そうな画像をファイルから読み込んで表示を行なってみる。
対応フォーマットは XPMらしい。……なんじゃそりゃ? Windowsユーザには聞き慣れないフォーマットだ。
ファイルフォーマット辞典,いくつかのペイントソフト,画像フォーマット資料ファイルのどこにも存在しない。
Gtk+オリジナルフォーマットか?

ディスク上を検索すると,ゴロゴロと XPMファイルが出て来た。Linuxでは当たり前のフォーマットらしい。
バイナリエディタが無いので,冗談でテキストエディタで開いてみたら,開けた(笑)
テキスト記述の画像フォーマットなのか?

インターネット上で検索したが,ビュアーはあっても,XPM形式で保存出来るようなツールは非常に少なかった。
残念ながらフリーウェアを見つける事は出来なかったので,一番安いシェアウェアを使う事にする(だって画像形式変換したいだけだもん……)

XPM形式は 256色までらしいので,予め減色をして BMP形式保存しておく。
透過色指定が出来るので,GIF形式にしても良いと思う。

○XPM画像表示プログラム

XPM画像が作りにくいと言う話は,とりあえず置いといて,プログラミングしてみます。
ところが,手元の本には画像に関する説明が異様に少なく,殆ど分からなかった(;_;)
そこで,様々な予測を元に,何とか画像表示に成功した。

#include <gtk/gtk.h>

int main(int argc, char *argv[]){
GtkWidget *window;
GtkStyle *style;
GdkPixmap *pixmap;
GdkPixmap *mask;
GtkWidget *pixmapwid;

gtk_init(&argc, &argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);

style=gtk_widget_get_style(window);
pixmap=gdk_pixmap_create_from_xpm(window->window, &mask, &style->bg[GTK_STATE_NORMAL], "ファイル名");
pixmapwid=gtk_pixmap_new(pixmap, mask);
gtk_container_add(GTK_CONTAINER(window), pixmapwid);
gtk_widget_show(pixmapwid);

gtk_widget_show(window);
gtk_main();
return 0;
}

【注意】
終了ボタンの無いウィンドウシステムで実行すると,停止できなくなります(多分)

処理内容は下記の通りです。
・gtk+ヘッダをインクルード
・main関数から処理を開始
・最初に必ず gtk_init関数を呼び出す
・ウィンドウ定義

ここからが画像表示の為の処理ですので詳しく説明します。

style=gtk_widget_get_style(window);
ウィンドウの情報を取得します。

pixmap=gdk_pixmap_create_from_xpm(window->window, &mask, &style->bg[GTK_STATE_NORMAL], "ファイル名");
パラメータは順に下記の通りです。
・生成した window内に表示する。
・マスクカラーを元に,マスク画像も生成されて maskに格納されます。
・ウィンドウの背景色をセットします。
・ここで指定した XPM形式ファイルを読み込み,GdkPixmap形式で保存します。

pixmapwid=gtk_pixmap_new(pixmap, mask);
画像データとマスクデータより,GtkWidget形式で保存します。

gtk_container_add(GTK_CONTAINER(window), pixmapwid);
画像をウィンドウに追加する。

gtk_widget_show(pixmapwid);
画像を表示する。

・gtk_widget_show関数にて,ウィンドウ表示
・gtk_main関数にて,メッセージを待つループに入る(gtk+はメッセージ駆動型言語)
・returnで関数を抜けて処理終了

○問題点

このプログラミング法では,大きな問題点がある事が分かる。

・フルカラー画像が扱えない
XPM形式では 256色までしか扱えない。但し,透過色が扱える事は評価する。

・画像表示位置を指定できない
どう見ても,座標指定があるようには思えない関数群だ。

・ウィンドウサイズが断りも無く変わる
ソースを見ると分かるが,ウィンドウサイズを指定するところが無い。
ウィンドウだけを表示した場合は,小さく表示されるのだが,画像を表示するとサイズが大きくなる。

・画像の部分表示が出来ない
ファイルから読み取った画像を,一部分だけ表示したい場合に,その方法が分からない。

・不明なフォーマットが多い
一般的に見慣れないローカル形式を沢山採用しているように見える。
しかもそれが,次々にフォーマット変換を行なっている。
フォーマット調査が不可欠になるような手順は困る。




トップメニュープログラムリーブラ