使用C++代码生成一张图片,需要用到PPM图像格式。 [

](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051301-300x101.png)](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051301.png) PPM格式介绍: PBM 是位图(bitmap),仅有黑与白,没有灰 PGM 是灰度图(grayscale) **PPM 是通过RGB三种颜色显现的图像(pixmaps)** 每个图像文件的开头都通过2个字节「magic number」来表明文件格式的类型(PBM, PGM, PPM),以及编码方式(ASCII 或 Binary),magic number分别为P1、P2、P3、P4、P5、P6 [![](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051305-300x120.png)
](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051301-300x101.png)](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051301.png) PPM格式介绍: PBM 是位图(bitmap),仅有黑与白,没有灰 PGM 是灰度图(grayscale) **PPM 是通过RGB三种颜色显现的图像(pixmaps)** 每个图像文件的开头都通过2个字节「magic number」来表明文件格式的类型(PBM, PGM, PPM),以及编码方式(ASCII 或 Binary),magic number分别为P1、P2、P3、P4、P5、P6 [![](http://www.wjgbaby.com/wp-content/uploads/2018/05/18051305-300x120.png)
编码方式: ASCII格式适合人类阅读理解,可以用文本编辑器打开,读取对应图像的数据(比如PPM格式的RGB值)。 Binary格式适合机器阅读,按照二进制形式,顺序存储图像信息,不用空格分隔,所以图像处理起来更有效率,占用空间容量更少(由于缺少空格)。 PPM格式: ** PPM图像格式分为两部分,分别为头部分和图像数据部分。** ** 头部分:由3部分组成,通过换行或空格进行分割,一般PPM的标准是空格。** ** 第1部分:P3或P6,指明PPM的编码格式,** ** 第2部分:图像的宽度和高度,通过ASCII表示,** ** 第3部分:最大像素值,0-255字节表示。** 图像数据部分: ASCII格式:按RGB的顺序排列,RGB中间用空格隔开,图片每一行用回车隔开。 Binary格式:PPM用24bits代表每一个像素,红绿蓝分别占用8bits。 代码:

#include
#include

using namespace std;

int main()
{
ofstream outfile;
outfile.open(“IMG.txt”);

int nx = 800;
int ny = 400;
outfile << "P3\\n" << nx << " " << ny << "\\n255\\n";
for (int j = ny - 1; j >= 0; j--)
{
    for (int i = 0; i < nx; i++)
    {
        //从左到右,红色通道值增加
        float r = float(i) / float(nx);

        //从上到下,绿色通道值减小
        float g = float(j) / float(ny);

        //蓝色通道值不变
        float b = 0.2f;

        int ir = int(255.99f \* r);
        int ig = int(255.99f \* g);
        int ib = int(255.99f \* b);
        outfile << ir << " " << ig << " " << ib << "\\n";
    }
}
outfile.close();
return 0;

}

最后生成一个txt文件,修改后缀为ppm: 用photoshop打开ppm文件,最后的效果图如下: PPM参考链接:https://www.jianshu.com/p/e809269b4ad7 参考书籍:《Ray Tracing in One Weekend》 RTIOW系列项目地址:GitHub RTIOW系列笔记: RTIOW-ch1:Output an image RTIOW-ch2:The vec3 class RTIOW-ch3:Rays, a simple camera, and background RTIOW-ch4:Adding a sphere RTIOW-ch5:Surface normals and multiple objects RTIOW-ch6:Antialiasing RTIOW-ch7:Diffuse Materials RTIOW-ch8:Metal RTIOW-ch9:Dielectrics RTIOW-ch10:Positionable camera RTIOW-ch11:Defocus Blur RTIOW-ch12:Where next