有关于位图的2个问题

timehyh   2008-7-14 15:29 楼主
第一个问题:在使用GetObject(hBitmap, sizeof(BITMAP), &bm)函数取得的位图的属性中的bm.bmBitsPixel表示的应该是位图的位深吧?但是我在XP的系统上使用该函数的时候,当我把系统的分辨率设置为16位时,该函数得到的就为16,如果把系统的分辨率设置为32位时,该函数得到的就为32,不管使用什么样位深的位图都是这样的结果,感觉与位图的无关,而与系统有关。但是,当我在开发板上使用该函数的时候情况就变了,函数得到的值和图片的位深相同,请问这是为什么?是否是我在使用上由什么不对的地方。
第二个问题:我对24位位深的位图计算它的存放RGB颜色的数组的大小时,我使用bm.bmWidth*bm.Height*3来计算。而我看到有别人是这样来计算:bm.bmHeight*WIDTHBYTES(bm.bmWidth*24)
其中:#define  WIDTHBYTES(bits) ((((bits) + 31)>>5)<<2)
这样他计算出来的长度比我的大些,而且经过我试验证明他的计算方法是对的,而我的却不对,少了一点。少的数量正好是图片的高度,是否是图片在格式上有什么要求,比如说象字符串一样在每行的后面要有一个\0的结束符一样(这种说法肯定不正确)?我想问下为什么我的计算方法不对,而他的又是对的???

回复评论 (4)

没人理我, UP
点赞  2008-7-14 16:33
第二个问题数据补齐.第一个不知道. 你可以搜索一下BITMAP来了解相关知识
点赞  2008-7-14 16:54
1.位图数据分为DIB(设备无关)和DDB(设备有关),当hBitmap是由DDB创建时,GetObject得到的是与设备有关的信息,所以和你的系统显示设备有关,至于你在开发板上发现一样,由于你没描述清楚,一个可能是开发板LCD本来就是16位的,刚好和你的位图一样,另一个可能是你用的系统不同,API生成的可能就是DIB,所以是和位图文件数据一致,位图文件可以看作DIB。

2.位图的结构是标准的,无论是多少位,每行象素规定是4字节对齐,WIDTHBYTES(bm.bmWidth*24) 正是计算成对齐的行象素个数。
  如果图象宽度是奇数,都要补齐,多出的数据不会被API用来显示。你应该先看位图结构的标准文档。
点赞  2008-7-15 09:59
很感谢nbcool(载舟之水),现在已经基本明白了。
点赞  2008-7-16 15:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复