详解Linux下读取位图的注意事项

发布时间 - 2026-01-11 02:11:41    点击率:

详解Linux下读取位图的注意事项

 在Linux下读取位图遇到的问题,很好地体现了linux与Windows操作系统的不同。按理说位图格式与操作系统无关,读取也应该无关,实际上在位图读到内存中时已经不同。下面主要介绍自己在Linux下操作位图遇到的问题。

(一)、位图结构

    位图一开始是两个结构体,包括位图的详细信息,是读取后面数据的关键。所以读取位图首先要正确读取这两个结构体:BITMAPFILEHEADER和BITMAPINFOHEADER。其具体定义为:

typedef struct tagBITMAPFILEHEADER 
{ // bmfh 
  WORD  bfType; 
  DWORD  bfSize; 
  WORD  bfReserved1; 
  WORD  bfReserved2; 
  DWORD  bfOffBits; 
}__attribute__ ((packed))BITMAPFILEHEADER; 
typedef struct tagBITMAPINFOHEADER 
{ // bmih 
  DWORD biSize; 
  LONG  biWidth; 
  LONG  biHeight; 
  WORD  biPlanes; 
  WORD  biBitCount; 
  DWORD biCompression; 
  DWORD biSizeImage; 
  LONG  biXPelsPerMeter; 
  LONG  biYPelsPerMeter; 
  DWORD biClrUsed; 
  DWORD biClrImportant; 
}__attribute__ ((packed))BITMAPINFOHEADER; 

    上面两个结构是Windows下可以正常使用的。但是Linux下没有WORD、DWORD之类的变量类型,所以我们需要将这些变量映射到Linux下的常用变量类型:

typedef unsigned short WORD; 
typedef unsigned int DWORD; 
typedef int LONG;//use int not long here!!! 
typedef unsigned char BYTE; 

    上述映射要特别注意每个类型的字节数。不同的操作系统变量的长度不同,我们在定义时首先需要用sizeof获得本机器的变量类型长度,然后再根据位图每个属性长度去选择合适的变量类型。在此第三个变量LONG在windows下是四个字节,但是在Linux下是八个字节,所以我们需要用int来代替LONG。

(二)、对齐

     在位图结构的定义中,我们在结构体名称前面添加了语句__attribute__ ((packed))。__attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。在windows下,读取操作不会优化,按照结构体实际的大小去读取,但是在Linux下,为了加快访存速度,会启用访存的对齐操作。这时读到内存中的结构体大小就大于最初的定义,此时如果按照之前的大小去访问位图属性,将读到错误的数值。为了使访问方便,我们需要禁止对齐优化。

(三)、位图数据

    对于24位真彩色位图,位图不包括调色板,位图数据就是RGB颜色的值。所以很多人认为数据的大小就是3*height*width,读取数据的时候直接利用这个大小,但这是错误的。24位真彩色位图每一行还需要满足一个条件:数据长度能被4整除,否则需要用0补齐到能被4整除。所以读取的过程需要一行一行完成,而且在每一行的末尾,我们都需要跳过一定数量的0,这个计算公式如下:                                   

    skip=(4-(3*width)%4)%4;

    C语言下,读取过程如下:

for(int i=0;i<height;i++) 
{ 
  fread(p,sizeof(unsigned char)*width*3,1,fp); 
  p+=sizeof(unsigned char)*width)*3; 
  fseek(fp,skip*sizeof(unsigned char),SEEK_CUR); 
 
} 

(四)、RGB顺序

    如前所述,24位真彩色位图不包括调色板,位图数据就是RGB颜色的值,每个颜色占据一个字节。此时很多人认为颜色的顺序是R、G、B,但这也是错误的,实际的顺序应该是B、G、R。这一点也需要特别注意。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Linux下读取位图  # Linux  # 读取位图的方法  # Linux 快速定位web路径方法  # Linux环境下段错误的产生原因及调试方法小结  # Linux下执行java程序的方法  # Linux无盘工作站的做法  # Linux rpm tar 操作系统下软件的安装与卸载方法  # Linux NFS服务器的安装与配置方法(图文详解)  # linux下/etc/passwd文件的选项说明  # 读到  # 需要用  # 很多人  # 操作系统  # 真彩色  # 不包括  # 这是  # 很好  # 但是在  # 在此  # 这两个  # 希望能  # 按理说  # 然后再  # 还需要  # 但这  # 正常使用  # 特有的  # 第三个  # 谢谢大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何快速搭建高效WAP手机网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Linux系统命令中tree命令详解  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  JS实现鼠标移上去显示图片或微信二维码  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何快速重置建站主机并恢复默认配置?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel怎么使用Intervention Image库处理图片上传和缩放  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel如何实现文件上传和存储?(本地与S3配置)  深圳网站制作培训,深圳哪些招聘网站比较好?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  javascript基于原型链的继承及call和apply函数用法分析  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何用PHP快速搭建CMS系统?  Windows Hello人脸识别突然无法使用  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  企业网站制作这些问题要关注  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Swift中循环语句中的转移语句 break 和 continue  如何彻底删除建站之星生成的Banner?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel怎么在Controller之外的地方验证数据  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】