BMP调色板仅存在于biBitCount≤8时位于bfOffBits偏移处每项4字节BGRReserved大小为1biBitCount或biClrUsed行数据按4字节对齐偏移计算需区分bottom-up/top-down。怎么读取 BMP 文件里的调色板palette数据BMP 的调色板只存在于 BITMAPINFOHEADER 中 biBitCount ≤ 8 的情况比如 1-bit、4-bit、8-bit 索引色图。它紧挨着文件头和信息头之后存放每个调色板项是 4 字节B、G、R、Reserved通常为 0顺序是蓝-绿-红不是 RGB。常见错误是直接按 RGBQUAD 结构体 memcpy却忽略文件可能没对齐——BMP 调色板起始位置必须是 4 字节对齐而信息头长度本身可能不是 4 的倍数所以要手动跳过填充字节。先读 BITMAPFILEHEADER 得到 bfOffBits它就是调色板起始偏移也是像素数据起始偏移用 fseek(fp, bfOffBits - palette_size, SEEK_SET) 回退到调色板开头再读比靠计算更可靠调色板大小 1 × 4 字节但若 codebiClrUsed 0则只取前 biClrUsed 项有些图像只用了部分调色板别硬编码 256 项——biBitCount 1 时只有 2 项 4 时是 16 项怎么算每一行像素在文件里的起始位置行偏移BMP 每行像素数据必须是 4 字节对齐的所以实际每行占用字节数不是简单的 width * bytes_per_pixel而是向上对齐到 4 的倍数 ((width * bits_per_pixel 31) / 32) * 4整数除法。这个值叫 row_size。容易踩的坑是以为像素数据从 bfOffBits 开始就连续排布——其实第 0 行通常是图像底部在最前面第 height-1 行在最后而且如果 biHeight 是负数说明是 top-down 图像此时第 0 行在顶部但 Windows 大多数工具仍输出 bottom-downbiHeight 0。立即学习“C免费学习笔记深入”第 y 行从 0 开始计数的文件偏移 bfOffBits (height - 1 - y) * row_sizebottom-down 情况如果 biHeight 则偏移 codebfOffBits y * row_sizerow_size 必须用位宽算不是用字节数例如 1-bit 图width17 → 实际每行占 ((17 31) / 32) * 4 8 字节不是 3别用 width * sizeof(pixel_type) 直接乘——1-bit 和 4-bit 根本没有“pixel_type”它们是 packed bits怎么正确解析 1-bit / 4-bit 像素数据packed 格式1-bit 和 4-bit BMP 不是每个像素占独立字节而是把多个像素 pack 进一个字节高位在前MSB first且每行从左到右填满不足 8 位的部分补 0。这意味着你得逐 bit 或逐 nybble 解包不能当字节数组直接 cast。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。