本帖最后由 KeyTo9_Fans 于 2009-12-19 14:46 编辑
我的头像挺精致的吧?
其实做这样的图片只需写短短的几行代码就可以了:-
- #include<cstdio>
-
- char hd[54]={66,77,38,106,0,0,0,0,0,0,54,0,0,0,40,0,0,0,0,8,0,0,0,6,
- 0,0,1,0,24,0,0,0,0,0,-16,105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- int i,j,k,l,n,m,B,G,R;
- double a,b,x,y,z,p,px,py;
-
- int main()
- {
- printf("宽度 高度 横坐标 纵坐标 放大倍数: ");
- scanf("%d%d%lf%lf%lf",&m,&n,&px,&py,&p);
- FILE *f=fopen("KeyTo9_Fans.bmp","wb");
- hd[18]=m&255;
- hd[19]=m>>8;
- hd[22]=n&255;
- hd[23]=n>>8;
- for(i=0;i<54;i++)
- fprintf(f,"%c",hd[i]);
- for(i=0;i<n;i++)
- {
- if((i+1)*80/n>i*80/n)printf("|");
- for(j=0;j<m;j++)
- {
- a=(j-m/2+0.5)/m/p+px;
- b=(i-n/2+0.5)/m/p+py;
- l=1;x=0;y=0;
- for(k=-64;k<1024;k++)
- {
- z=x*x-y*y+a;
- y=2*x*y+b;
- x=z;
- if(x*x+y*y>4)
- {
- if(k<=0){B=255;G=191-k;R=255;}
- if(0<k&&k<64){B=255;G=191;R=255-k;}
- if(63<k&&k<128){B=255;G=127+k;R=255-k;}
- if(127<k&&k<256){B=383-k;G=255;R=127;}
- if(255<k&&k<384){B=383-k;G=255;R=k-128;}
- if(383<k&&k<640){B=0;G=639-k;R=255;}
- if(639<k&&k<768){B=k-639;G=0;R=895-k;}
- if(767<k&&k<896){B=127;G=0;R=895-k;}
- if(k>895){B=1023-k;G=0;R=0;}
- fprintf(f,"%c%c%c",B,G,R);
- l=0;break;
- }
- }
- if(l)fprintf(f,"%c%c%c",0,0,0);
- }
- }
- return 0;
- }
复制代码 附件是该代码编译出来的可执行程序,即使没有编程工具也可以运行。
运行程序,按如下格式输入5个参数就可以生成一张图片:
896 672 -0.16143 1.03879 20000
这5个参数分别是图片宽度、图片高度、中心点横坐标、中心点纵坐标、放大倍数。
我的头像正是用这组参数生成的。
放大倍数理论上多大都没问题,但由于计算机进行实数运算的精确程度有限,所以最高放大倍数只能达到10万亿倍左右,再放大就变成巨大的方块了。
注意:图片宽度和图片高度必须是4的倍数,不然生成出来的图片好像会囧掉*_*
KeyTo9_Fans.rar
(40.63 KB, 下载次数: 7)
|