【发布时间】:2020-02-17 20:48:22
【问题描述】:
我正在尝试解析 ppm 文件。
规格是这样的:http://netpbm.sourceforge.net/doc/ppm.html
例子:
P3
# feep.ppm
4 4
15
0 0 0 0 0 0 0 0 0 15 0 15
0 0 0 0 15 7 0 0 0 0 0 0
0 0 0 0 0 0 0 15 7 0 0 0
15 0 15 0 0 0 0 0 0 0 0 0
“15”之后的东西是给定图像中所有像素的rgb值。
到目前为止我已经尝试过了:
void read_and_draw_ppm_file() {
ifstream infile;
infile.open(TEXTURE_FILE.c_str());
string line;
int count = 0;
while (getline(infile, line) && count < 4) {
count++;
}
char c;
int red = -1, green = -1, blue = -1;
int rgb_count = 0;
for (int i = 0; i < TEXTURE_WIDTH; i++) {
for (int j = 0; j < TEXTURE_HEIGHT; j++) {
infile >> c;
if (rgb_count == 0) {
if (red != -1 && blue != -1 && green != -1) {
cout << red<<endl;
cout << green<<endl;
cout << blue<<endl;
uint32_t colour = (255 << 24) + (int(red) << 16) + (int(green) << 8) + int(blue);
window.setPixelColour(i, j, colour);
red = -1;
blue = -1;
green = -1;
}
red = (int) (unsigned char) c;
rgb_count++;
} else if (rgb_count == 1) {
green = (int) (unsigned char) c;
rgb_count++;
} else if (rgb_count == 2) {
blue = (int) (unsigned char) c;
rgb_count = 0;
}
}
}
infile.close();
}
这个想法基本上是提取 3 个字节的三元组,然后分别将每个转换为 rgb。
问题是,当我将图像显示到屏幕上时,图像与预期的不太一样。
我哪里错了?
原图:
【问题讨论】:
-
和想象的不太一样:你能详细说明一下图片有什么问题吗?此外,您正在将输入文件作为字符而不是数字来读取。
-
用预期输出/实际输出编辑
-
您可以一次做更少的事情,如果您读取 ppm 文件,将其写回第二个文件,然后使用一些现有软件查看图像。这样你就可以找出问题是在读取文件还是在显示图像
-
这一行
red = (int) (unsigned char) c;会给你ASCII码。将其替换为red = c - '0'。另外,想想如何处理像15这样的数字。您正在逐字阅读。 -
我试过这样阅读:
infile >> c;我的输出 imqge 仍然与预期的输出不匹配