理解PGM数据并将PGM数据加载到向量/数组中



让我在前面说,这是我第一次使用C++中的PGM文件格式,所以我有很多问题。

  1. 我目前正在使用P2 PGM文件,但我读到P5的使用要简单得多。如何将P2转换为P5?

  2. 使用P2,我试图拍摄图像,并将像素值转移到2D矢量或阵列或任何可远程索引的对象。我使用的是一个非常基本的图像(白色背景,前景是黑色矩形(。到目前为止,这是我的代码:

fstream img;
img.open(PATH_NAME, ios::in | ios::binary | ios::out);

string line;
getline(img, line); //header part that says "P2"
//stores column and row values
getline(img, line);
istringstream iss(line);
string row_string, col_string;
iss >> row_string;
iss >> col_string;
int original_rows = stoi(row_string);
int original_cols = stoi(col_string);

getline(img, line);//collects maxval
//now I am collecting actual image/pixel data
getline(img, line);
cout << line;

最后一部分的问题是,当我cout << line;时,这是输出:

377377377377377377377377377377377377

和on,on,on的时间比一行应该的要长得多(在我的示例照片中有162列,这个代码输出的时间远远超过162377s(。最大值是255,所以我真的不确定问题出在哪里。

  1. 至于实际将这些值转换为可索引的值,我该如何处理?到目前为止,我的想法是取每一行字符串,检测"\",并以这种方式收集单个值,并将其存储在数组中;将每个字符串转换为int,然后将其存储在向量中。说起来容易做起来难,所以我对更有效的选择持开放态度

问题是您混淆了文本I/O和二进制I/O。据我所知,P5文件中的图像数据是作为二进制字节值保存的。因此,您应该使用read将其读取为字节向量(或类似内容(,而不是使用用于文本I/O的getline读取。

像这个

vector<unsigned char> raster(original_rows*original_cols);
img.read(raster.data(), original_rows*original_cols);

raster是可索引的东西。

最新更新