Wikipedia 上对ppm文件的解释
.ppm 格式文件,水平向右为x轴正方向,以垂直向下为y正方向,解读如下:
第一行 P3 表示为文件type为 Pixmap 格式。
3 2 分别表示列数和行数,或者理解为x轴的长度和y轴的长度,或理解为图形的宽和高。
再往下一行 255 表示像素的最大值
之后有x * y个(r,g,b)三元组,它会按照顺序读取,并且在图像的左上角开始一行一行扫描设置像素值。
#include <iostream>
int main() {
// Image
int image_width = 256;
int image_height = 256;
// Render
std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";
for (int j = 0; j < image_height; ++j) {
std::clog << "\rScanlines remaining: " << (image_height - j) << ' ' << std::flush;
for (int i = 0; i < image_width; ++i) {
auto r = double(i) / (image_width-1);
auto g = double(j) / (image_height-1);
auto b = 0;
int ir = static_cast<int>(255.999 * r);
int ig = static_cast<int>(255.999 * g);
int ib = static_cast<int>(255.999 * b);
std::cout << ir << ' ' << ig << ' ' << ib << '\n';
}
}
std::clog << "\rDone. \n";
}
在这段代码中,有一些需要注意的事项:
像素按行输出。
每行像素从左到右进行输出。
这些行按照从上到下的顺序进行输出。
根据约定,每个红/绿/蓝分量在内部使用取值范围为0.0到1.0的实值变量表示。在打印输出之前,必须将它们缩放为0到255之间的整数值。
红色从完全关闭(黑色)向右边逐渐变亮(鲜红),绿色从顶部完全关闭逐渐变暗(黑色)至底部。将红光和绿光混合会产生黄色,因此我们预期右下角应该是黄色的。