hur.cn - 华软网

 热门搜索

求一个霸气的算法

  作者:未知    来源:网络    更新时间:2011/10/4
众所周知,BMP图像的一行长度必须是4字节的整数倍。
比如:一个24bits的宽是50像素的BMP,那么一行的长度是50*3=150,不是4的整数倍,我们需要调整成152
又比如:一个8bits的宽是49像素的BMP,那么一行长度是49*1=49,不是4的整数倍,我们需要调整成52
我通常是这样做的:
int nBytes = biBitCount / 8;
DWORD bmWidthBytes = nWidth * nBytes % 4 ? (nWidth * nBytes) + 4 - (nWidth * nBytes % 4) : tgWidth * nBytes;//一行占多少个字节(4字节的倍数)
虽然没有错,但写起来很复杂,且好象不是最优的算法吧?


---华软 网友回答---
DWORD bmWidthBytes = (nWidth * nBytes % 4) + nWidth * nBytes;
虽然不明白你说的什么
---华软网友回复---
DWORD bmWidthBytes = 4 - (nWidth * nBytes % 4) + nWidth * nBytes;

---华软网友回复---
引用 2 楼 hezhe1008 的回复:
DWORD bmWidthBytes = 4 - (nWidth * nBytes % 4) + nWidth * nBytes;

这样写如果整好是4的整数倍,不就多加了个4吗?
---华软网友回复---
那就加个判断好了
---华软网友回复---
引用 4 楼 hezhe1008 的回复:
那就加个判断好了

那不又成了我上面的写法了?
---华软网友回复---
int nBytes = biBitCount / 8;
DWORD bmWidthBytes = ((int)(tgWidth*nBytes/4 + 0.9)) * 4;  //除以4之后向上取整,再乘4

也不是很优,不嫌麻烦就写个switch
switch(nWidth * nBytes % 4)
{
case 0:
.....
}
---华软网友回复---
引用 5 楼 firefly3233 的回复:
引用 4 楼 hezhe1008 的回复:
那就加个判断好了

那不又成了我上面的写法了?

就这么一个小功能 ,还想找什么复杂算法。。。
---华软网友回复---
C++">
#define WIDTHBYTES(bits) (((bits)+31)/32*4)

DWORD LineByte,ImgSize;                                                       
//分配内存空间把源图存入内存,其中,8位的位图其bitCount = 8,24位真彩位图的 bitCount = 24
LineByte = WIDTHBYTES(width*bitCount);
ImgSize=height*LineByte;

//申请内存如下:
BYTE *Imgdata=(BYTE *)malloc(ImgSize);


---华软网友回复---
DWORD bmWidthBytes = (DWORD)(nWidth * nBytes + 3)/4
---华软网友回复---
8楼的方法不错。经验证正确。
9楼的方法不对,应该是:
DWORD bmWidthBytes = (DWORD)(nWidth * nBytes + 3)/4 * 4
这个经验证也是对的。
这两种方法最霸气且效率最高。
结帖
---华软网友回复---
不过第一种方法更好,适合于1bits,4bits的情况,因为有此种BMP图像      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。