分析一个写图片的c++程序

来源:互联网 发布:网络教育试点高校 编辑:程序博客网 时间:2024/06/16 00:42
#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 rootunsigned 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(数据,数据类型大小(字节数),写入数据的最大数量,文件指针);}
0 0
原创粉丝点击