讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么在不使用第三方库的情况下手动解析BMP位图像素数据【实战】

轻明小哥_3350

轻明小哥_3350

发布时间:2026-03-30 21:42:12

|

443人浏览过

|

来源于php中文网

原创

正确读取BMP需先校验bfType为0x4D42,再依bfOffBits定位像素数据;行数据须按4字节对齐,且图像数据自底向上存储;位深与通道顺序须结合biBitCount和biCompression判断,结构体须用packed避免对齐错误。

c++怎么在不使用第三方库的情况下手动解析bmp位图像素数据【实战】

怎么读取BMP文件头和位图信息头

直接用 fread 读 54 字节就能拿到标准 BMP 的文件头(BITMAPFILEHEADER)和信息头(BITMAPINFOHEADER),但必须校验 bfType 是 0x4D42(即 "BM"),否则不是合法 BMP。Windows BMP 常见但不保证是 54 字节——如果 biSize 大于 40,说明用了扩展头(比如带颜色空间或伽马信息),这时不能硬写死 54,得按 bfOffBits 偏移去读像素数据起始位置。

  • bfOffBits 才是真正像素数据的起始偏移,它可能大于 54(例如含调色板时)
  • 32 位 BMP 没有调色板,bfOffBits 通常是 54;24 位同理;但 8 位 BMP 一定有 256 项调色板,占 1024 字节,bfOffBits 就是 54 + 1024 = 1078
  • 别用 sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 算偏移——结构体可能因对齐填充变大,bfOffBits 才是唯一可信值

怎么正确读取像素数据并处理行对齐

BMP 的每行像素字节数必须是 4 的倍数,不足就补 0(叫“行填充”)。比如宽度为 101 像素的 24 位图,每行真实需 101 × 3 = 303 字节,但磁盘上占 304 字节(补 1 个 0x00)。如果忽略这点,后续行数据会整体错位。

  • 计算每行存储字节数:(width * bits_per_pixel + 31) / 32 * 4(等价于向上取整到 4 字节对齐)
  • 读取时,每行按这个对齐长度读,但只取前 width * bytes_per_pixel 字节作有效像素
  • 注意:BMP 像素从左下角开始存,第一行数据对应图像最下面那行——要显示或处理成常规坐标,得把行顺序倒过来

怎么区分 24 位和 32 位 BMP 并提取 RGB/RGBA

看 biBitCount:24 表示 RGB 每通道 8 位,无 alpha;32 表示 RGBA,但 Windows 默认 alpha 为 0(不透明),且部分老工具生成的 32 位 BMP 其实没用 alpha,只是对齐需要。关键不是位数,而是 biCompression 是否为 BI_BITFIELDS(此时才有掩码定义通道布局)。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 24 位:每像素 3 字节,顺序是 B、G、R(不是 RGB!)
  • 32 位常见情况:B、G、R、A 顺序,但必须检查 biCompression == BI_RGB 才能默认此顺序;若为 BI_BITFIELDS,得读后面的 3 个掩码(dwRedMask 等)确定 R/G/B/A 位置
  • 很多所谓“32 位 BMP”其实是 BI_RGB + 32 biBitCount,此时第 4 字节常为填充位,不是 alpha——别直接当透明度用

遇到 Invalid BMP signature 或花屏怎么办

90% 是因为没校验 bfType 或误判了 bfOffBits,剩下 10% 是字节序或结构体对齐惹的祸。BMP 文件是小端序,但结构体在内存中受编译器对齐影响,pragma pack(2) 或 __attribute__((packed)) 必须加,否则 BITMAPFILEHEADER 读出来字段全错。

立即学习“C++免费学习笔记(深入)”;

  • 先用十六进制查看器打开 BMP,确认开头确实是 42 4D(即 "BM")
  • 打印出读到的 bfOffBits 和实际文件大小,看是否超出范围
  • 用 sizeof 打印你定义的结构体大小,和 Windows SDK 中定义对比——如果不一致,说明没 pack,字段偏移全乱
  • 调试时临时把每行像素 dump 成二进制,用 Python 快速验证:读出来的 BGR 数据用 numpy reshape 后 cv2.imshow,比肉眼盯 hex 更快定位错位点

真正麻烦的从来不是读数据,而是 BMP 格式本身留了太多历史缝隙:对齐规则、头结构变长、压缩标志歧义、alpha 存在性模糊……动手前先用 xxd -l 64 your.bmp 看前 64 字节,比查文档快十倍。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5234

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5411

2025.07.04

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3419

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2958

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1528

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2699

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3350

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1697

2023.08.10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn