?shù)組行對(duì)齊規(guī)則與像素?cái)?shù)據(jù)計(jì)算(進(jìn)階計(jì)算篇))
一、BMP 行對(duì)齊規(guī)范Windows BMP 強(qiáng)制要求像素行數(shù)據(jù)4 字節(jié)內(nèi)存對(duì)齊。單行有效像素字節(jié)無(wú)法被 4 整除時(shí)行尾自動(dòng)填充 Padding 字節(jié)補(bǔ)齊填充字節(jié)無(wú)有效圖像信息僅用于適配內(nèi)存尋址。二、核心計(jì)算公式分辨率width(列) × height(行)代表整張圖行列像素?cái)?shù)量?參數(shù)定義width圖像寬度單位像素、depth圖像色深單位bit、height圖像高度單位像素1. 單行有效像素字節(jié)未對(duì)齊stride_valid width * (depth / 8)2. 單行硬件對(duì)齊字節(jié)真實(shí)內(nèi)存行寬根據(jù) stride_valid 判定若為 4 的整數(shù)倍則直接使用若不滿(mǎn)足則向上補(bǔ)齊至最近的 4 的整數(shù)倍3. 像素?cái)?shù)組總存儲(chǔ)大小size_pixel stride_real * |height|三、公式實(shí)戰(zhàn)演算為完整驗(yàn)證對(duì)齊公式采用非對(duì)齊對(duì)齊雙案例演算覆蓋所有開(kāi)發(fā)場(chǎng)景案例1非對(duì)齊尺寸10×10、24bit用列數(shù)計(jì)算單行有效字節(jié)列數(shù) × 單像素字節(jié)數(shù)1. 單行有效字節(jié)10 * (24 / 8) 302. 單行對(duì)齊判定30 不是 4 的整數(shù)倍向上補(bǔ)齊至最近 4 的倍數(shù)真實(shí)行寬 32 字節(jié)3. 像素總字節(jié)32 * 10 320案例2標(biāo)準(zhǔn)對(duì)齊尺寸1920×1080、24bit用列數(shù)計(jì)算單行有效字節(jié)列數(shù) × 單像素字節(jié)數(shù)1. 單行有效字節(jié)1920 * (24 / 8) 57602. 單行對(duì)齊判定5760 是 4 的整數(shù)倍無(wú)需補(bǔ)齊真實(shí)行寬 5760 字節(jié)3. 像素總字節(jié)5760 * 1080 6220800四、BMP 像素底層存儲(chǔ)特性4.1 行序倒置機(jī)制BMP 以 height 正負(fù)區(qū)分存儲(chǔ)行序height 0主流標(biāo)準(zhǔn)像素行從畫(huà)面底部向頂部倒置存儲(chǔ)height 0非常規(guī)格式從上至下正序存儲(chǔ)常規(guī) BMP 解析需做垂直翻轉(zhuǎn)校正畫(huà)面。4.2 色彩通道BGR 硬件原生排布24bit 真彩色 BMP 單像素占 3 字節(jié)內(nèi)存低地址 → 高地址固定排布為B→G→R與常規(guī) RGB 順序相反。核心原因完全適配x86 小端存儲(chǔ)模式。低地址存低位通道、高地址存高位通道是硬件層級(jí)的固定內(nèi)存排布規(guī)則Windows BMP 直接沿用該規(guī)范。開(kāi)發(fā)坑點(diǎn)忽略小端特性、按 RGB 順序解析會(huì)直接導(dǎo)致紅藍(lán)通道互換圖像色彩失真。五、開(kāi)發(fā)避坑要點(diǎn)禁止使用寬×高×單像素字節(jié)計(jì)算像素大小忽略填充字節(jié)會(huì)導(dǎo)致圖像花屏、像素錯(cuò)位行尾填充字節(jié)為無(wú)效數(shù)據(jù)像素遍歷解析時(shí)需主動(dòng)舍棄像素起始地址必須讀取bfOffBits動(dòng)態(tài)字段嚴(yán)禁硬編碼 54 字節(jié)24bit BMP 嚴(yán)格遵循 BGR 通道解析規(guī)則標(biāo)準(zhǔn)倒置存儲(chǔ)的 BMP 圖像必須完成垂直翻轉(zhuǎn)校正