求一个霸气的算法

firefly3233 2011-10-04 03:37:02
众所周知,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字节的倍数)
虽然没有错,但写起来很复杂,且好象不是最优的算法吧?

...全文
137 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
firefly3233 2011-10-04
  • 打赏
  • 举报
回复
不过第一种方法更好,适合于1bits,4bits的情况,因为有此种BMP图像
firefly3233 2011-10-04
  • 打赏
  • 举报
回复
8楼的方法不错。经验证正确。
9楼的方法不对,应该是:
DWORD bmWidthBytes = (DWORD)(nWidth * nBytes + 3)/4 * 4
这个经验证也是对的。
这两种方法最霸气且效率最高。
结帖
呔妖怪来嘛 2011-10-04
  • 打赏
  • 举报
回复
DWORD bmWidthBytes = (DWORD)(nWidth * nBytes + 3)/4
TandyT 2011-10-04
  • 打赏
  • 举报
回复

#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);

呔妖怪来嘛 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 firefly3233 的回复:]
引用 4 楼 hezhe1008 的回复:
那就加个判断好了

那不又成了我上面的写法了?
[/Quote]
就这么一个小功能 ,还想找什么复杂算法。。。
ztpgiggs2 2011-10-04
  • 打赏
  • 举报
回复
int nBytes = biBitCount / 8;
DWORD bmWidthBytes = ((int)(tgWidth*nBytes/4 + 0.9)) * 4; //除以4之后向上取整,再乘4

也不是很优,不嫌麻烦就写个switch
switch(nWidth * nBytes % 4)
{
case 0:
.....
}
firefly3233 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hezhe1008 的回复:]
那就加个判断好了
[/Quote]
那不又成了我上面的写法了?
呔妖怪来嘛 2011-10-04
  • 打赏
  • 举报
回复
那就加个判断好了
firefly3233 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hezhe1008 的回复:]
DWORD bmWidthBytes = 4 - (nWidth * nBytes % 4) + nWidth * nBytes;
[/Quote]
这样写如果整好是4的整数倍,不就多加了个4吗?
呔妖怪来嘛 2011-10-04
  • 打赏
  • 举报
回复
DWORD bmWidthBytes = 4 - (nWidth * nBytes % 4) + nWidth * nBytes;
呔妖怪来嘛 2011-10-04
  • 打赏
  • 举报
回复
DWORD bmWidthBytes = (nWidth * nBytes % 4) + nWidth * nBytes;
虽然不明白你说的什么

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧