转的一个帖子 关于CreateBitmap

《WIDOWS程序设计》619页上说,执行下面的操作

hBitmap   =   CreateBitmap(7,9,5,3,NULL);

时Windows为象素位分配内存,粗略的计算此位图需要7*9*5*3即945位,相当于118个字节多一点。
     (1)我不理解为什么要乘5呢?5可是颜色板的数目,颜色板到底是什么?

下面又说Windows为位图分配内存时,每行象素都具有偶数个字节,即
iWidthBytes=2*((cx*cBitsPixel+15)/16);      
//(2)为什么要加15?         

或者
iWidthBytes=((cx*cBitsPixel+15)&~15)> > 3;
//(3)这个式子是怎么得出来的?
 
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
回复次数: 2
  • jimconrad
  • (jimmy)
  • 等 级:
#1楼 得分:0回复于:2002-05-16 19:13:46
(cx*cBitsPixel+15)&~15后面的&~15是以16字节进行内存对齐的意思。请查msdn关于操作符   &   和   ~   的文档.
 
  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
精华推荐: C/C++板块常见问题集:(写给新手),欢迎大家补充,帮顶也可以
  • jimconrad
  • (jimmy)
  • 等 级:
#2楼 得分:0回复于:2002-05-16 19:33:37
问题(3)
pos&~15其实就是把变量pos的最后8bit变为0,其他位不变.比如:如果pos=0x32345453   (16进制数)
那么执行运算后pos=0x32345400

问题(2)
+15的是进位算法。设有以下算式   a   =   A/16;   程序作者的意图是:如果
(float)A/16   小数部分不为0,那么无论小数是否满足四舍五入条件都进位到个位。等效于下面程序:
if(   (A%16)   !=   0   ){      //如果不能整除
           a   =   (A-A%16)+16;
             a   =   a/16;
}else{                                          //如果整除
           a   =   a/16;
}
注意:整型相除的时候,程序是将小数部分舍弃的。

问题(1)
我没看过这本书。颜色板就是一系列的颜色值,比如16色,那么颜色板里就有0到15这16个值,然后显卡根据这些值选择相应的颜色输出。

你可能感兴趣的:(转的一个帖子 关于CreateBitmap)