转自:http://wenda.tianya.cn/question/510127906cc5c480
在VC++中,读入BMP图像必须把每行所占的字节数转换为4的倍数,用了这个公式(biwidth*biBitCount/8+3)/4*4,不明白其含义
注意:C语言的除法里,两个int相除,结果会被CUT掉——只取商而不取余数。
biwidth*biBitCount/8 好理解,就是一个扫描行的字节数(如:100 * 24/8,即100 * 3 ,有100个像素,每个像素有3个字节,所以每行总字节数为300),
记 b = biwidth*biBitCount/8, 那么, 原式 =(b+3)/4*4,
情况一,b是四的倍数,(b+3)/4*4
== (b/4*4 + 3/4*4) == b + 0 == b
(如上:300是4的倍数,所以(300+3)/4*4 == (300/4*4)+3/4*4 == 75*4+(3/4*4)(因C程序里两个int相除,只取整数,所以3/4*4等于0 ),即结果为300 Bytes)
情况二,b不是四的倍数
另
b = 4x+n,其中4x就是x的4倍数,n就是那个余数。
容易得知:1 <= n <= 3, 4 <= n+3 <= 6,
于是,原式 == (4x+n + 3)/4*4,
(其中x是任意值),
== (4x/4*4 + (n+3)/4*4)
在C语言中 == 4x + 4 == (x+1)*4
例如:
1. (16)/4*4 == 16,
2. (18+3)/4*4 == (16+2+3)/4*4 == (16 + 5)/4*4 == (4+1)*4 == 20
(33+3)/4*4 == (32+1+3)/4*4 == (32 + 4)/4*4 == (8+1)*4 == 36
(34+3)/4*4 == (32+2+3)/4*4 == (32 + 5)/4*4 == (8+1)*4 == 36
(35+3)/4*4 == (32+3+3)/4*4 == (32 + 6)/4*4 == (8+1)*4 == 36