libppm

機能

ppmライブラリー

起動方法

#include <ppm.h>
cc ... -L/CG/lib -I/CG/include -lppm -lpgm -lpbm

説明

データの型

    typedef ... pixval;
        pixval の値の範囲は 0 から PPM_MAXMAXVAL (整数値)までである。
#define PPM_MAXMAXVAL ... typedef struct ... pixel; extern pixval ppm_pbmmaxval; ppm_pbmmaxval は PPM プログラムで PBM ファイルを 読み込む時に使用される PBM の最大値である。 通常値は 1 だが、プログラムによっては それ以上の値にした方が良い場合がある。 #define PPM_FORMAT ... #define RPPM_FORMAT ... #define PPM_TYPE PPM_FORMAT #define PPM_FORMAT_TYPE(int format) format が ppm の時は PPM_TYPE、そうでない時は -1 を返す。

ピクセル操作

pixval PPM_GETR(pixel p)
pixval PPM_GETG(pixel p)
pixval PPM_GETB(pixel p)
ピクセルから色の値を取り出すマクロ
void PPM_ASSIGN(pixel p, pixval red, pixval grn, pixval blu)
色の値をピクセルにセットするマクロ
int PPM_EQUAL(pixel p, pixel q)
二つのピクセルが等しいかどうかチェックするマクロ
void PPM_DEPTH(pixel newp, pixel p, pixval oldmaxval, pixval newmaxval)
ピクセルの色の最大値を変えるマクロ
double PPM_LUMIN(pixel p)
ピクセルのluminanceを返すマクロ

PPMのメモリーマネージメント

pixel **ppm_allocarray(int cols, int rows)
pixelのcols個のメモリーをrows個アロケートする関数
pixel *ppm_allocrow( int cols )
pixelのcols個のメモリーをアロケートする関数
void ppm_freearray( pixel **pixelrow, int rows )
ppm_allocarray()でアロケートしたメモリーを解放する関数
ppm_freerow( pixelrow )
ppm_allocrow()でアロケートしたメモリーを解放する関数

PPMファイルを読む関数

void ppm_readppminit( FILE *file, int *colsP, int *rowsP, pixval *maxvalP, int *formatP )
PPMファイルからヘッダーを読む関数
void ppm_readppmrow( FILE *file, pixel *pixelrow, int cols, pixval maxval, int format )
PPMファイルから一行分データを読む関数
pixel ** ppm_readppm( FILE *file, int *colsP, int *rowsP, pixval *maxvalP )
PPMファイルから全部のデータを読む関数
返り値は各行のpixelデータの入った配列へのポインタの配列になっている。
この関数は ppm_readppminit(), ppm_allocarray() and ppm_readppmrow()を 組み合わせたものである。
だからヘッダーを読み込まないで良い。

PPMファイルへ書き込む関数

void ppm_writeppminit( FILE *file, int cols, int rows, pixval maxval, int forceplain )
PPMファイルへヘッダーを書き込む関数
forceplain が 0 ならバイナリー、1 ならアスキーでデータを書き込む。
void ppm_writeppmrow( FILE *file, pixel *pixelrow, int cols, pixval maxval, int forceplain )
PPMファイルへ一行分のデータを書き込む関数
forceplain が 0 ならバイナリー、1 ならアスキーでデータを書き込む。
void ppm_writeppm( FILE *file, pixel **bits, int cols, int rows, pixval maxval, int forceplain )
PPMファイルへ全てのデータを書き込む関数
forceplain が 0 ならバイナリー、1 ならアスキーでデータを書き込む。
この関数はppm_writeppminit() and ppm_writeppmrow()を組み合わせたものである。
だからヘッダーを書き込まないで良い。
pixel ppm_backgroundpixel(pixel **pixels, int cols, int rows)
PPMファイルのバックのpixelの値を返す関数

注意

実はこれらの中でppmを読む関数はこのまま pgm, pbmにも使える。
その時 PPM_GETR(), PPM_GETG(), PPM_GETB()には同じ値が入る。
pgmのばあいは 0 から PGM_MAXMAXVAL まで、pbmの場合は PBM_WHITE か PBM_BLACK である。
だから別々に作る必要はない。

使用例

PPMの読み込みと書き込み

#include <stdio.h>
#include <ppm.h>
main()
{
    int x, y;
    FILE *infile, *outfile;
    int cols, rows, format;
    pixval maxval, red, green, blue;
    pixel *pixelrow, *outpixelrow;
    
    infile = pm_openr("in.ppm");
    ppm_readppminit( infile, &cols, &rows, &maxval, &format );
    pixelrow = ppm_allocrow( cols );
    outfile = pm_openw("out.ppm");
    ppm_writeppminit( outfile, cols, rows, maxval, 0 );
    outpixelrow = ppm_allocrow( cols );
    for(y = 0; y < rows; y++)
    {
        ppm_readppmrow( infile, pixelrow, cols, maxval, format );
        for(x = 0; x < cols; x++)
        {
            red = PPM_GETR(pixelrow[x]);
            green = PPM_GETG(pixelrow[x]);
            blue = PPM_GETB(pixelrow[x]);
            /* red, green, blueに関する処理をここに入れる */
            PPM_ASSIGN(outpixelrow[x], red, green, blue);
        }
        ppm_writeppmrow( outfile, pixelrow, cols, maxval, 0 );
    }
    ppm_freerow( outpixelrow );
    ppm_freerow( pixelrow );
    pm_close(outfile);
    pm_close(infile);
}

参照

プログラマー/バージョン

(C) 1989, 1991 by Tony Hansen and Jef Poskanzer.

Home | Contents
abe@injapan.net