首页 > 解决方案 > 理解 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;

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

\377\377\377\377\377\377\377\377\377\377\377\377\

并且持续不断地比单行长得多(我的示例照片中有 162 列,此代码输出远多于 162 377s)。maxval 是 255,所以我不太确定问题出在哪里。

  1. 至于实际将这些值转换为可索引的东西,我该怎么做?到目前为止,我的想法是获取每个字符串行,检测“\”并以这种方式收集各个值并将其存储在一个数组中;将每个字符串转换为 int,然后将其存储在向量中。说起来容易做起来难,所以我愿意接受更有效的选择。

标签: c++vectorfile-iofstreampgm

解决方案


问题是您将文本 I/O 与二进制 I/O 混淆了。据我了解,P5 文件中的图像数据保存为二进制字节值。因此,您应该使用 将其读入字节向量(或类似的)read,而不是使用getlinewhich is for text I/O 来读取它。

像这样

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

raster你的东西是可索引的。


推荐阅读