プログラム解説
更新日2001.01.09
プログラム解説
初版 2000.10.10
最終改訂日 2001.01.09
(現在この解説を作成中で未完ですが、このままでも多少の役に立つかも知れ
ないとして公開します)
[概要]
winnシリーズ(本システム)はsunrasterfile形式の画像ファイルを読み出
し、XWindowの上に表示する。
[本システムのねらい]
本システムでは、sunrasterfile形式の画像データをファイルから読み出し、
これをXWindowシステムにより標準的なワークステーションの8ビットカラーデ
ィスプレイ(256色の集まりで表現する)に表示する。本システムの目的は、
ファイルの読み取りからディスプレイへの出力への道筋をなるべく手間をかけ
ずに理解し使えることである。このため、ディスプレイ用のプログラムは簡素
で、高い表示性能はねらいとしていない(winn-acは多少の例外だが)。
[sunrasterfile形式]
sunrasterfile形式データの読み出しに当たっては、ヘッダの読み出しと、
正味データの読み出しがある。詳しくはヘッダ部(画像横・縦画素数、格納形
式等)、カラーマップがあり、正味の画像データはそれに続いて入っている。
[ダイレクトカラーと非ダイレクトカラー]
sunrasterfileにおけるカラーの主な形式は、カラーマップがなく正味画像
データ部がrgbの組を直接表すダイレクトカラー形式とカラーマップを有し、
正味画像データ部がカラーマップ中のピクセル番号を指すもの(非ダイレクト
カラー)である。
ダイレクトカラーは一番直感によく合い理解しやすいが、本システムで対象
とするXWindowでポピュラーなのはカラーマップ形式である。このため、ダイ
レクト形式のデータを読んでXWindowに表示する場合は処理が複雑で理解が難
しい。非ダイレクトカラー形式はディスプレイの形式と似ているため、技術的
対応は容易である。しかしこれは画像の表現力が弱く(1画面中256種類の色し
か表せない)ある程度限られた使い方しかできない。濃淡データ(モノクロデ
ータ)は一番処理が容易で理解しやすい。しかしその場合もカラーマップを扱
う必要がある。
[カラーマップ]
カラーマップとは、r,g,bを組として1ピクセルのデータ(詳しくは付加情報
もある)で、その番号(ピクセル値)によってアクセスする。1つの画像デー
タの各点の値はピクセル値で表す。このピクセル値が1つの色を意味する。こ
れは、画像の各点を8ビットで表す(8ビットカラー)もので、0〜255の数値
が、その点の色を表す。、なお、XWindowにおいては濃淡も一つの色(r,g,bの
値が同じ組で表す)として表される。XWindowの表示に当たってはカラーマップ
が必ず必要である。
本システムでは、入力データの種類に関わらずディスプレイへの表示は
put_imageによってvdispなるデータを用いて行う。各数値がどの色を表してい
るかは、Xcolor型のcolorなるデータによって判断する。各数値はcolorのピク
セル番号を表しており、各ピクセルはr,g,b(各16ビット)の組によって色を
表している。
XWindow向けのカラーマップは柔軟性があるため、すべてプライベートカラー
マップを用いている。設定はset_cmapをコールして行う。
rasterfile形式でカラーマップと称するものは、r,g,b各8ビットのデータで、
XWindowのピクセル値(r,g,b各16ビット+付加情報)とは異なる。また、
XWindowではr,g,bを組にしているが、rasterfile形式のカラーマップデータは、
例えばrデータが256個、gデータが256個、bデータが256個という形式で入って
いる。
XWindowで表示するには16ビット形式のデータ(XColor形式)を整える必要
がある。rasterfile形式にカラーマップがあるときは、それから作り、ダイレ
クトカラー形式のデータの場合は、(8ビットカラーのワークステーションを
想定するため)、ダイレクトを8ビットに押し込める必要がある。これは表示
のためだけで、正味のデータは損なわれない。ダイレクトカラー形式のデータ
向けにmk_dircolで、標準カラーマップ形式のデータを作り(関連データcolor,
cmap)、これをプライベートカラーマップに用いる。
簡単なものから複雑なものに進むほうが全体の理解がしやすいので以下ではそ
のようにする。
モノクロデータの読み出しと表示
8ビット形式のモノクロデータは、ヘッダ、カラーマップ、正味データの順
で入っている。
/* ---------- winn-m ---------- */
メインルーチンはwinn-m.cに例を取る。
/* usage example winn-m ~/Video_data/gazou/hirosue.ras */ とソースプロ
グラムにあるように、このルーチンの実行時の引数として読み出すべきファイ
ルの名前を与える。
rasin = get_image(data_name, &width, &height, &pixs);
でget_image関数をコールする。与えられたdata_nameのファイルを読みに行き、
結果は画像の幅(width)、高さ(height)、rasterfileとしてのカラーマッ
プのピクセル数(pixs)が返ってくる。また、正味の画像データや付随する色々
の情報はrasin構造体(visio.hで定義)に書き込まれ、関数の戻り値としてそ
のポインタが返る。get_image関数の詳細は別記する。
winn-mでは、読み出した画像データをvdataに、処理結果を入れるエリアを
vdata2としている。vdataはget_imageの中で、必要なエリアが確保されている
ので、winn-m.cではunsigned char *vdataとして、それを用いればよい。
vdataのサイズはsunrasterfileのデータから自動的に読み取られるので、固定
の配列を作る必要がない。処理するためのエリアvdata2はmalloc関数をコール
することによって確保する。
関数の解説
/* -------- get_image -------- */
/*画像ファイルデータの読み込み*/
/* ヘッダ部を読み込み(ない場合(grayのとき)は作る)、colorデータを整
え、正味のラスターデータを読む このシステムでは画像サイズはヘッダ等から
自動的に決める ユーザプログラムも配列等をコーディング段階で決めなくて
よい */
画像データファイルから得られたデータはrasin構造体に返すのを基本とする。
int *width, int *height, int *pixs については、get_imageが返す基本的
なものを示す意味で冗長ではあるが、別途にも返している。pixsはrasterfile
形式のカラーマップのピクセル数。rasin構造体については別途。その内vdata
は、正味の画像データへのポインタで、画像データはダイレクトカラー形式の
場合は生の、r,g,b値が、非ダイレクトカラー形式の場合はカラーピクセル番
号を意味している。
XWindowに表示する観点からは非ダイレクトカラー形式の方が自然で、
rasterfile形式のカラーマップからXWindow形式のカラーマップを作り(ピク
セル番号を一致させる)、vdataを用いてput_imageで表示すればよい。
ダイレクトカラー形式の場合は、24ビット等のカラーデータを本システムが
想定している256カラーの管面に表示するため、適当なカラーマップを用意し
て(カラー表示精度を落として)用いる。非ダイレクトカラー、ダイレクトカ
ラー形式のいずれでも、プライベートカラーマップを用いる。
/* ---------- put_image ---------- */
put_image
8ビットピクセル値の配列で表された画像データをcolorに従って表示する
ディスプレイは256階調のカラーを想定している。
XImage
*put_image(u_char *vdisp, int width, int height, int depth
, Window win, XColor *color, int pixs, int gray)
vdisp 入力画像データ、width * heightのサイズの、depth 8ビット想定
win 表示すべきディスプレイの識別子
*color ポインタで表されたカラーマップ、各ピクセルはr,g,bの組を表し、
vdataの画素値はそのピクセル番号を意味している。
モノクロ画像表示上の注意
ディスプレイはモノクロモニタを想定せず、カラーモニタを想定している。
モノクロ画像を表示しようとするときは、vdataに濃淡値を直接入れ(これは
通例の表現)、カラーマップのピクセル値がこれに対応するようにする。
r,g,bの三つ組みはすべて同じ数値とし、ピクセル値0〜255に値0〜255を入れ
る。mk_nrmcmpはcolor形式(16ビットのrgb)を与えられた8ビットのカラー
データ(rasterfileの形式)から作る関数で、上記の目的には次のようにすれ
ばよい。
XColor *color; int pixs; u_char *colbuf;
pixs = 256;
colbuf = (u_char *)malloc(pixs *3);
for(i = 0; i < pixs; i++){
colbuf[i ] = colbuf[pixs + i] = colbuf[2*pixs + i] = i;
}
color = mk_nrmcmp(pixs, colbuf);
上記のcolbufに相当するデータは、モノクロの場合8ビットカラーの場合の
rasterfileデータに含まれている。
/* -------- set_colbuf -------- */
/* rasterfileのカラーマップ部分の読み込み */
/* -------- mk_nrmcmp -------- */
/* 標準的rasterfile(非ダイレクトカラー、カラーマップあり)向けcolorの処
理 */
/* sunrasterfile形式のカラーマップ(8ビットr*pixsの形式がr,g,bの順)
からXWindow形式のカラーデータ(XColor形式)を作る */
/* 従来、rasterfile中のカラーマップデータを読みだして、直接処理してい
たが、読み出し部はcolbufに譲り、柔軟性を増した(rasterfile由来でない
colbufを与えて処理できる)。 */
/* ---------- data_to_disp ---------- */
/* ダイレクトカラーデータ向けにvdataからvdispデータを生成 */
/* ダイレクトカラーでは正味24ビットのデータが供給されるが、このシステ
ムはXWindowの8ビットカラーを想定しているので、8ビット/画素のデータを作
る
/* -------- mk_nrmcmp -------- */
/* 標準的rasterfile(非ダイレクトカラー、カラーマップあり)向けcolorの処
理 */
/* sunrasterfile形式のカラーマップ(8ビットr*pixsの形式がr,g,bの順)
からXWindow形式のカラーデータ(XColor形式)を作る */
/* -------- mk_dircol -------- */
/* ダイレクトカラー向けcolorの処理(プライベートカラーマップ向け標準カ
ラーマップ形式データの生成) */
/* このシステムの表示はXWindowの8ビットカラーを想定しているので、24ビッ
トダイレクトカラー等から対応するXWindow向けcolorデータ(XColor : cmap
の材料)を作る。これを用いてプライベートカラーマップを生成する。ここで
XStandardColormap形式scmapも与える。*/
質問・連絡は oshima@ipc.tosho-u.ac.jpまで
戻る
Home > プログラム公開のページ > 画像処理サンプルプログラムwinn > プログラム解説