详解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【方案】

