分析一个写图片的c++程序
2016-04-29 20:12
381 查看
#include <iostream> #include <cmath> #include <cstdlib> #include <cstdio> #define DIM 1024 #define DM1 (DIM-1) #define _sq(x) ((x)*(x)) // square #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root unsigned char GR(int,int);//三原色中的绿色 unsigned char BL(int,int);//蓝色 unsigned char RD(int i,int j){//红色 return (char)(_sq(cos(atan2(j-512,i-512)/2))*255);//(j-512,i-512)的原因是:原点在文件的中心。cos(atan2(j-512,i-512)/2)中除2的原因:由于cos()的范围是(-1,1),当/2后cos()的范围(0,1)。//然后再将(0,1)范围内的数求平方,这样做的结果是增加(0,1)范围的稀释度。最后×255得到(0,255)范围的数,说白了就是相当于rand()函数,不过这个函数的依赖是(x,y)这个点的位置,而不是硬件上的信息。 } unsigned char GR(int i,int j){ return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255);//acos是反余玄函数。其中acos(-1)的结果是3.14159,2×acos(-1)/3的结果是120度,而前面atan2()的结果范围是(0,90度),减过后是(-120度,-30度). } unsigned char BL(int i,int j){ return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);//度数范围(120度,210度). } void pixel_write(int,int);//在指定的点上写入。 FILE *fp;//创建一个文件。 int main(){ fp = fopen("MathPic.ppm","wb");//创建一个.ppm格式的图片文件。 fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM);//申请1024×1024大小的空间。 for(int j=0;j<DIM;j++)//以循环的形式对整个空间进行扫描,用来写入所有的点上的颜色。 for(int i=0;i<DIM;i++) pixel_write(i,j); fclose(fp);//关闭文件。 return 0; } void pixel_write(int i, int j){ static unsigned char color[3];//有三种颜色即三色。 color[0] = RD(i,j)&255;//&255是用来"保证"颜色数不会超过255。255的二进制是11111111。 color[1] = GR(i,j)&255; color[2] = BL(i,j)&255; fwrite(color, 1, 3, fp);//fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针); }
相关文章推荐