您的位置:首页 > 其它

位图4字节对齐问题

2014-06-04 20:48 316 查看
在自己对图像数据进行处理的时候,会有字节对其的问题,由于之前使用的图像大都是8bit或者是24bit,32bit的图像,使用的对其公式是(pixelwidth*channel+3)/4*4。后面也有看到有些写法如:(width * bitCounts + 31) / 32 * 4,不是很理解原理。在网上查找,发现有解释的非常透澈的,下面借来用用。

原文链接:/content/1761744.html

1. 首先来自于这样一个公式:(width * bitCounts / 8 + 3) / 4 * 4,该公式含义比上面的公式要容易理解一些,比如biWidth * biBitCount代表了对齐前每行的总位数,位图有1位、2位、4位、8位、16位、24位、32位等,大于8位的都是8的倍数,所以biWidth * biBitCount / 8是对齐前的总字节数,要4字节对齐,除以4,看余数多少,不够多少补多少。而因为除以4的余数只能是0、1、2、3这四种情况,0就是刚好整除不需要再补,1、2、3分别需要补3、2、1个字节才能凑足4字节。那么
我们在除之前先补上3个字节会是什么情况呢,对于四种余数情形,分别是余3(3+0)、0(3+1)、1(3+2)、2(3+3),对于整数操作(width * bitCounts / 8 + 3) / 4得到的结果不会有余数,刚好达到了我们需要补足4字节的目的;另外再考虑能不能先补上别的数字,例如1、2,根据前面余数情况分析,补1会漏掉余数为1、2的情况,补2会漏掉余数为1的情况; 再考虑补上4或者更大数字的情况,余数为0的情形补4就多了4字节,数字再往上就更加多余,所以补上最大余数刚刚合适。

2. 上面的分析对于位宽大于等于8的位图已经正确,但小于8位的情况,width * bitCounts不一定是8的整数倍,所以我们先不要除以8,而是按照4字节等于32个bit位来计算,我们看看需要补多少位使得刚好32位对齐,那么就有公式:(width * bitCounts + n)/ 32 * 4 跟1中的分析方法相同,n应为32的最大余数31,所以得到最终公式:(width * bitCounts + 31)/ 32 * 4。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: