雕公 2022-11-13 15:14 采纳率: 100%
浏览 13
已结题

BMP文件头怎么写入?



// 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
位图信息

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-11-13 18:07
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月13日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效