/* */ /* 画像のファイル入出力 */ /* */ #include #include #include #include "vision.h" #define DEBUG 0 /* PGM 形式ファイルの読み書き pgmFileWrite pgmFileRead */ static char pgmFileHeader[] = "P5 %d %d %d\n"; /* 配列 data[] : 各画素のピクセル値 data[0] data[1] ... data[WIDTH-1] data[WIDTH] data[WIDTH+1] ... data[2WIDTH-1] ... ... ... data[(HEIGHT-1)*WIDTH] ... data[HEIGHT*WIDTH-1] 左上端から,右に進む. 右端に到達したら,一つ下の行の左端に進む. 右下端の画素で終了. */ extern int pgmFileWrite(FILE *fp, int width, int height, int max, unsigned char *data) { fprintf(fp, pgmFileHeader, width, height, max); fwrite(data, sizeof(unsigned char), width*height, fp); } extern int pgmFileRead(FILE *fp, int *pwidth, int *pheight, int *pmax, unsigned char *data) { fscanf(fp, pgmFileHeader, pwidth, pheight, pmax); fread(data, sizeof(unsigned char), (*pwidth)*(*pheight), fp); } #define BUFMAXSIZE 640*640 static unsigned char buf[BUFMAXSIZE]; /* 画像の入出力 imageWrite imageRead */ /* 画像をファイルに書き出す. 画像は二次元配列 double image[swidth][sheight] に入っている. swidth, sheight : 配列の大きさ 画像の横幅はwidth,高さはheightである. ピクセル値は, image[i][j] i=woffset, woffset+wstep, ..., woffset+wstep*(width-1) j=hoffset, hoffset+hstep, ..., hoffset+hstep*(height-1) 左下端格子点 [woffset,hoffset] 横方向:wstep毎 縦方向:hstep毎 に入っている. image[0][HEIGHT-1] ... image[WIDTH-1][HEIGHT-1] ... ... ... image[0][1] image[1][1] ... image[WIDTH-1][1] image[0][0] image[1][0] ... image[WIDTH-1][0] */ extern int imageWrite(FILE *fp, int width, int height, int woffset, int hoffset, int wstep, int hstep, int swidth, int sheight, double *image) { int i, j, k; #if DEBUG fprintf(stderr, "imageWrite: width=%d height=%d\n", width, height); #endif if (width > swidth || height > sheight) { fprintf(stderr, "imageWrite: width %d > size %d or height %d > size %d\n", width, swidth, height, sheight); exit(1); } if (width*height >= BUFMAXSIZE ) { fprintf(stderr, "imageWrite: width %d times height %d >= %d >= %d\n", width, height, width*height, BUFMAXSIZE); exit(1); } k = 0; for (j = hoffset+hstep*(height-1); j >= hoffset; j -= hstep) { for (i = woffset; i < woffset+wstep*width; i += wstep) { //buf[k++] = image[sheight*i+j]; buf[k++] = ELEMENT(image,swidth,sheight,i,j); } } pgmFileWrite(fp, width, height, PIXELMAXVALUE, buf); } /* 画像をファイルから読み込む. 画像は二次元配列 double image[swidth][sheight] に入る. swidth, sheight : 配列の大きさ 画像の横幅は *pwidth,高さは *pheight に入る. ピクセル値は, image[i][j] i=woffset, woffset+wstep, ..., woffset+wstep*(width-1) j=hoffset, hoffset+hstep, ..., hoffset+hstep*(height-1) 左端端格子点 [woffset,hoffset] 横方向:wstep毎 縦方向:hstep毎 に入る. image[0][HEIGHT-1] ... image[WIDTH-1][HEIGHT-1] ... ... ... image[0][1] image[1][1] ... image[WIDTH-1][1] image[0][0] image[1][0] ... image[WIDTH-1][0] */ extern int imageRead(FILE *fp, int *pwidth, int *pheight, int woffset, int hoffset, int wstep, int hstep, int swidth, int sheight, double *image) { int i, j, k, max; pgmFileRead(fp, pwidth, pheight, &max, buf); #if DEBUG fprintf(stderr, "imageRead: width=%d height=%d\n", *pwidth, *pheight); #endif if (*pwidth > swidth || *pheight > sheight) { fprintf(stderr, "imageRead: width %d > size %d or height %d > size %d\n", *pwidth, swidth, *pheight, sheight); exit(1); } if ((*pwidth)*(*pheight) >= BUFMAXSIZE) { fprintf(stderr, "imageRead: width %d times height %d >= %d > %d\n", *pwidth, *pheight, (*pwidth)*(*pheight), BUFMAXSIZE); exit(1); } k = 0; for (j=(*pheight)-1; j>=0; j--) { for (i=0; i<(*pwidth); i++) { //image[sheight*i+j] = buf[k++]; ELEMENT(image,swidth,sheight,i,j) = buf[k++]; } } }