关于Harvard CS50x中BMP图像翻转代码的padding计算疑问
拆解BMP填充计算代码:
int padding = (4 - (bi.biWidth * sizeof(RGBTRIPLE)) % 4) % 4; 先明确BMP的硬性规则:图像的每一行像素数据,总字节数必须是4的整数倍,如果原始像素数据的字节数不够,就得在每行末尾加填充字节(填充字节不影响图像显示)。
分步拆解代码逻辑:
计算一行原始像素的字节数:
bi.biWidth * sizeof(RGBTRIPLE)bi.biWidth是图像的横向像素个数RGBTRIPLE是BMP中存储单个像素的结构体,占3字节(R、G、B各1字节)- 两者相乘就是一行像素数据的真实字节数,比如10个像素对应30字节。
计算原始字节数除以4的余数:
(bi.biWidth * sizeof(RGBTRIPLE)) % 4- 模运算
%在这里用来求除法的余数,判断当前行的字节数离4的倍数还差多少。 - 比如30字节除以4,商7余2,余数为2,说明还差2字节才到32(4的8倍);如果是12字节(4个像素),除以4余数为0,说明刚好是4的倍数。
- 模运算
计算需要补充的填充字节数(初次计算):
4 - 余数- 用4减去余数得到理论上需要补充的字节数:余数为2时,4-2=2,补2字节;但如果余数为0,4-0=4,这就出错了——因为刚好是4的倍数时根本不需要填充。
第二次模运算修正错误:
(4 - 余数) % 4- 这一步专门处理余数为0的情况:当
4 - 余数等于4时,4%4=0,把错误的4修正为0,符合“无需填充”的要求;如果是其他情况(比如4-2=2),2%4还是2,不影响正确结果。
- 这一步专门处理余数为0的情况:当
举几个例子验证:
- 情况1:图像宽度=4像素 → 4*3=12字节 → 12%4=0 → (4-0)%4=0 → padding=0(正确,无需填充)
- 情况2:图像宽度=5像素 →5*3=15字节 →15%4=3 →(4-3)%4=1 →padding=1(补1字节后16是4的倍数)
- 情况3:图像宽度=10像素 →10*3=30字节 →30%4=2 →(4-2)%4=2 →padding=2(补2字节后32是4的倍数)
内容的提问来源于stack exchange,提问作者Brandon12
相关产品推荐
相关产品推荐

