使用C++代码生成一张图片,需要用到PPM图像格式。 [ 编码方式: 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