C语言保存位图文件时的一个问题(.bmp文件)

265 篇文章 0 订阅

http://hi.baidu.com/yanghao86/item/310c2359f227cfccd48bacb2

位图文件大概可以分为四个部分:bmp文件头(BITMAPFILEHEADER),位图信息头(BITMAPINFOHEADER),调色板和位图数据。我在用C语言保存一个位图文件的时候,发现保存的文件是错误的,无法正常打开,最后查找发现竟然是因为结构体的内存对齐造成的。

 

typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; 
  DWORD   bfSize; 
  WORD    bfReserved1; 
  WORD    bfReserved2; 
  DWORD   bfOffBits; 
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

 

上面就是BITMAPFILEHEADER在MSDN中的定义(C语言中WORD为unsigned short,DWORD为unsigned long),可以看出第一个成员bfType为占用2字节,第二个成员bfSize占用4字节,问题来了,根据内存对齐规则,如果编译器的默认对齐模数(或者通过#pragma pack设置的对齐模数)大于或等于4,则第二个成员bfSize将从字节偏移为4的地方开始存放,而第一个成员bfType只有两字节,这样在第一个成员和第二个成员之间将会出现两个没有用的填充字节,同时整个结构体的大小也将是16字节。

如果将这个BITMAPFILEHEADER结构体直接写入文件当中,显然是不符合bmp文件的格式的,自然也就无法正常打开了,解决办法是在定义结构体之前通过#pragma pack将对齐模数设为2或1,根据内存对齐规则,BITMAPFILEHEADER结构体中就不会再出现填充字节了,结构体的大小也将变为正常的14字节;当然为了不影响程序中别的部分,在结构体定义完之后,最好用#pragma pack()取消设置的对齐模数。

如果不想用这种方法,在写入文件时,就不能直接写入整个结构体,只能将结构体的成员依次写入。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是本人花费一定资金购买的倒立摆资料,和2013年电赛倒立摆配套!并且包含了阅读的软件。送给广大参赛学子,祝取得佳绩!如有侵权,请联系我删除,谢谢。 【作者基本信息】 天津理工大学, 控制理论与控制工程, 2007, 硕士 【摘要】 倒立摆是一个复杂的快速、非线性、多变量、强耦合、自然不稳定的非最小相位系统,是重心在上、支点在下控制问题的抽象。在对控制方法的研究过程中,科研人员往往因为找不到合适的实际控制对象,而失去了对研究成果做进一步深入研究的条件,也给理论成果转化为实用成果造成障碍。倒立摆结构简单、成本较低,可以有效地检验众多控制方法的有效性。在各种类型的倒立摆中,旋转倒立摆有其突出的优点,它是一个理想的控制理论研究平台,许多抽象的控制概念如系统稳定性、可控性、收敛速度和抗干扰能力等,都可以通过旋转倒立摆系统直观地表现出来。本文在深入研究旋转倒立摆系统结构原理和借鉴国内外该领域最新研究成果的基础上,对旋转倒立摆系统进行了建模分析和控制方法的研究。建立了旋转倒立摆系统的拉格朗日方程,经过在系统平衡点线性化之后,得到整个系统的状态方程描述。在采用LQR控制实现旋转倒立摆控制的基础上,将LQR控制和模糊控制结合起来,使它们相互协调配合,发挥各自的长处,进一步提高摆杆的稳定程度。经过实物控制,有效地改善旋转倒立摆的动态性能,提高了控制精度。设计BP网络,通过对控制样本的学习,实现对一级旋转倒立摆控制器的逼近。仿真结果表明,采用包含一个隐层的BP网络,适当选择隐层神经元个数,选择合理的网络模型参数和样本,可实现对一级旋转倒立摆控制器较好的逼近。最后,探讨了模糊控制和神经网络控制相结合,吸取两者的长处,实现旋转倒立摆控制的途径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值