#include <stdio.h> #include <string> #pragma warning(disable:4996) //! @brief PPM(RGB各1byte,カラー,テキスト)を読み込む //! @param [in] fname //! @param [out] width 画像幅 //! @param [out] height 画像高さ //! @param [out] vmax 最大値 //! @param [out] ppimg 確保したメモリのアドレスを格納するポインタのポインタ //! @retval true 読み込み成功 //! @retval false 読み込み失敗 bool ppmP3_read( const char* const fname, int *width, int *height, int *vmax, unsigned char** const ppimg ){ *width = -1; *height = -1; *vmax = -1; FILE* fp; fp = fopen(fname, "rb"); char tmp[2048]; char c; while (c = fgetc(fp)) { if (isspace(c)) continue; if (c == 'P') { //フォーマットを特定する c = fgetc(fp) - '0'; if (c != 3) { fclose(fp); return false; } continue; } if (c == '#') { //コメントを読み飛ばす while (c != '\r' && c != '\n') c = fgetc(fp); continue; } //幅取得 if (*width < 0) { int s = 0; while (1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *width = atoi(tmp); break; } } continue; } //高さ取得 if (*height < 0) { int s = 0; while (1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *height = atoi(tmp); break; } } continue; } //最大値(白)取得 if (*vmax < 0) { int s = 0; while (1) { if (isdigit(c)) { tmp[s++] = c; c = fgetc(fp); } else { tmp[s] = '\0'; *vmax = atoi(tmp); break; } } break; } else { break; } } if (*width < 0 || *height < 0 || *vmax < 0) { return false; } //メモリ確保 size_t memsize = *width* *height * 3; *ppimg = new unsigned char[memsize]; int read = 0; char text[100]; int index = 0; //メモリサイズ分まで読み込む while (read<memsize) { int c = fgetc(fp);//一文字取得 if (c == EOF)//入力できなかったらループから出る break; //数字ならストックする if (isdigit(c)) { text[index] = (char)c; index++; } else { //数字以外が入力されたら、 //ストックした数字を数値化 //ただし数字が何もストックされていないなら //なにもしない if (index) { text[index] = '\0'; (*ppimg)[read] = atoi(text); read++; index = 0; } } } return read == memsize; }
使用例:
int main() { int width; int height; int vmax; unsigned char* pimg; ppmP3_read("C:\\data\\a.ppm", &width, &height, &vmax, &pimg); }