#include #include #include "pnm_lib.h" #define LS_HEADER //----------------------------------------------------------------- // PNM画像の読込み //----------------------------------------------------------------- PIXEL* read_pnm(char* ifile,PNMInfo* pi) { char buffer[BUFSIZ]; PIXEL* pdata; int SizeImage; // ビットマップファイルヘッダの読み込み FILE* fp=fopen(ifile,"rb"); if(fp==NULL) { fprintf(stderr,"No such file or directory.\n"); return NULL; } // マジックナンバー fgets(buffer,BUFSIZ,fp); pi->itype = atoi(buffer+1); if(buffer[0]!='P' || pi->itype < 0 || pi->itype > 6){ fprintf(stderr,"pnm: format error\n"); return NULL; } // サイズ情報 pi->iw = pi->ih = 0; while(pi->iw==0 || pi->ih==0){ fgets(buffer,BUFSIZ,fp); if(buffer[0]!='#'){ sscanf(buffer,"%d %d",&pi->iw,&pi->ih); } } // 最大濃度数 if(pi->itype!=PNM_P1 && pi->itype!=PNM_P4){ pi->imax = 0; while(pi->imax==0){ fgets(buffer,BUFSIZ,fp); if(buffer[0] != '#'){ sscanf(buffer,"%d",&pi->imax); } } } else pi->imax = 1; // 画像サイズ if(pi->itype==PNM_P3 || pi->itype==PNM_P6){ SizeImage=(pi->iw*pi->ih)*3; } else { SizeImage=(pi->iw*pi->ih); } #ifdef LS_HEADER disp_header(*pi); #endif // 画像データの確保 if(!(pdata = (PIXEL*)calloc(sizeof(PIXEL),SizeImage))){ fprintf(stderr,"cannot alloc memory..\n"); fclose(fp); return NULL; } // 画像データの取得 if(pi->itype==PNM_P3 || pi->itype==PNM_P6){ PNM_Cimgread(&fp,*pi,pdata); } else { PNM_Gimgread(&fp,*pi,pdata); } // 後片付け fclose(fp); return pdata; } //----------------------------------------------------------------- // PPM: BMP形式へのデータ変換 //----------------------------------------------------------------- PIXEL* ppm2bmp(PNMInfo pi,PIXEL* pdata) { PIXEL* bdata; int i,x,y,size,line,add; // 1ラインあたりのデータ数: 4byte 境界にあわせる line = pi.iw * 3; if((line%4)!=0) line=((line/4)+1)*4; add = line-pi.iw*3; // 画像サイズ size = pi.ih * line; bdata = (PIXEL*)calloc(size,sizeof(PIXEL)); // 画像の値のコピー for(y=0;yr = pdata[y*pi.iw*3+x*3+0]; p->g = pdata[y*pi.iw*3+x*3+1]; p->b = pdata[y*pi.iw*3+x*3+2]; }