c++ - 理解 PGM 数据并将 PGM 数据加载到向量/数组中
问题描述
让我先说这是我第一次在 C++ 中使用 PGM 文件格式,所以我有多个问题。
我目前正在使用 P2 PGM 文件,但我读到 P5 使用起来要简单得多。如何将 P2 转换为 P5?
使用 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,所以我不太确定问题出在哪里。
- 至于实际将这些值转换为可索引的东西,我该怎么做?到目前为止,我的想法是获取每个字符串行,检测“\”并以这种方式收集各个值并将其存储在一个数组中;将每个字符串转换为 int,然后将其存储在向量中。说起来容易做起来难,所以我愿意接受更有效的选择。
解决方案
问题是您将文本 I/O 与二进制 I/O 混淆了。据我了解,P5 文件中的图像数据保存为二进制字节值。因此,您应该使用 将其读入字节向量(或类似的)read
,而不是使用getline
which is for text I/O 来读取它。
像这样
vector<unsigned char> raster(original_rows*original_cols);
img.read(raster.data(), original_rows*original_cols);
raster
你的东西是可索引的。
推荐阅读
- html - 使用浮动时保持底部边距
- swift - TableView里面的CollectionView
- c# - 未找到匹配项时从 List<> 返回默认值
- visual-studio - 用于单元测试的每个文件的可执行目标
- ruby-on-rails - 在 Rails 控制台中使用联接的 Update_all 查询
- javascript - 如何防止在等待ajax执行时发送多个请求?
- html - 如何通过单击其父级来显示子级的活动状态?
- c++ - 可变参数模板方法专业化
- c++ - Adobe DISPATCH_METHOD 用于禁用导航栏、书签和右键单击等 (MFC)
- google-maps - 保护 Places 服务的 Google API 密钥的正确方法是什么?