// NOTE: compile with g++ filename.cpp -std=c++11
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#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,int);
FILE *fp;
void pixel_write(int,int);
unsigned char RD(int i,int j){
// YOUR CODE HERE
return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}
unsigned char GR(int i,int j){
// YOUR CODE HERE
return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}
unsigned char BL(int i,int j){
// YOUR CODE HERE
return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255);
}
void pixel_write(int i, int j){
static unsigned char color[3];
color[0] = RD(i,j)&255;
color[1] = GR(i,j)&255;
color[2] = BL(i,j)&255;
fwrite(color, 1, 3, fp); }
int main(void){
fp = fopen("MathPic.ppm.bmp","wb");
//fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM); for(int j=0;j<DIM;j++)
unsigned char Head[54];
for(int i=0;1<54;i++) Head[i]=0;
Head[0]=0x42;Head[1]=0x4d;
Head[2]=0x36;Head[3]=0x00;Head[4]=0x03;Head[5]=0x00;
Head[10]=0x36;Head[14]=0x28;Head[19]=0x4;Head[23]=0x4;
Head[26]=0x1;Head[28]=0x18;
fwrite(Head,1,54,fp);
//for(int i=0;i<54;i++) fp.put(Head[i]);;
for(int i=0;i<DIM;i++)
for(int j=0;j<DIM;j++)
pixel_write(i,j);
fclose(fp);
printf("ok");
return 0; }
是把有没有这样一段代码让人感叹人类的智慧的代码改了一下。原本用c++的,我手机只有c4droid,所以改为头文件是c的。原文是生成P6二进制ppm的,我改为直接当成BMP。这就涉及到文件头那54字节了。我是先把54字节数组赋0,再慢慢改。第3/4/5/6字节是文件大小,图片是10241024的,一个点用3字节,102410243+54,我算算是0x00030036大,写到文件要倒过来。运行结果是segment fault。段失败?不知道是什么原因。我那fwrite (head 1,54,fp)应该没用错吧?不可能是手机上c4droid带不动10241024的运算吧?
很久以前我曾经这么做过成功了的,只是源代码弄丢了。直接把固定好的54字节文件头填充进去,图片信息用代码控制以生成不同的图片,这就是我的目的。
文件头 14字节
1标志 2字节 42 4d
2文件大小 4字节 倒序
3保留 4字节 00 00 00 00
4偏移 4字节 54即36 00 00 00
位图信息头 40字节
1 e-11 4字节 位头大小 40即28 00 00 00
2 12-15 4字节 宽1024即00 04 00 00
3 16-19 4字节 高1024即00 04 00 00
4 1a-1b 2字节 01 00
5 1c-1d 2字节 颜色 24即18 00
6 1e-21 4字节 不压缩 00 00 00 00
7 22-25 4字节 图像大小不压缩 00 00 00 00
8 26-29 4字节 水平 00 00 00 00
9 2a-2d 4字节 垂直 00 00 00 00
10 2e-31 4字节 索引色 00 00 00 00
11 32-35 4字节 00 00 00 00
位图信息