24位位图BMP内存像素顺序是bgr,转成32位处理更快
在图形处理领域如 GDI 或 Photoshop 内部通常都会将图片统一升位到32位 (ARGB)进行计算。处理完后只有在最后落盘保存时才压缩回24位。这样做有三个不可替代的优势1. 极致的计算速度 (DWord Alignment)在 32 位模式下每个像素正好占4 字节。这刚好是一个Long的长度也是 CPU 处理内存最舒服的步进。24位定位n y * stride x * 3涉及乘法且不能被 2 的幂整除32位定位n y * W x如果 $W$ 是 2 的幂CPU 甚至可以用位移指令完成计算2. 内存对齐 (No Padding)32 位图片的每一行字节数$W \times 4$永远是 4 的倍数。这意味着你完全不需要考虑stride补齐字节。每一行都是紧凑且对齐的。3. 支持透明度 (Alpha Channel)虽然 BMP 24位不支持透明但在 32 位内存中处理时你可以利用那多出来的第 4 个字节存储透明度实现图层混合Alpha Blending。实现流程建议第一步加载与升位不要手动读取最快的方法是利用 Windows 的DIB (Device Independent Bitmap)。使用CreateDIBSection创建一个 32 位的内存画布然后把 24 位 BMP 贴上去。第二步高速处理这时你可以使用你最想要的Long 数组绑定技术VBA 此时每一格就是一个像素直接赋值 像素Long(x y * W) HFF0000 纯蓝色 (假设是 0x00BBGGRR)第三步降位与保存保存时你依然面临两个选择手动写文件用嵌套循环每 4 字节取前 3 字节写入文件并手动补齐每行的stride。API 转换利用GetDIBits直接将 32 位内存数据转换并填充到一张 24 位的位图句柄中然后保存。性能对比表特性24位直接处理 (Byte)32位内存处理 (Long)内存定位复杂 (x*3)极简(x y*W)写入次数3 次 (B, G, R)1 次(Long)逻辑复杂度需计算 Stride无需考虑 Stride额外开销无初始转换 最终降位总结建议如果你只是修改几个点比如打个水印、画几条线直接用 24 位 Byte 数组转换的开销远大于处理的收益。如果你要做大规模图像算法比如全图滤镜、高斯模糊、图像合成必须升位到 32 位。这种情况下算法省下来的时间是极其可观的。如果你决定走 32 位路线你的LongPtrX64结构体中SizeOfType就要设为4(VT_I4)这样绑定出来的Value()数组就是Long类型的操作起来会爽快得多。