关于DIB对齐的问题。百分求助!

jlu3389 2008-03-04 11:16:13
读DIB内容到内存中是别人写的DLL。我负责声明一个Buffer,然后DLL把内容读进去,可现在有一个图片显示不正确,图象是歪的,查资料说是没对齐,我想问下,如何对已经存入Buffer中的数据进行对齐,用什么方法?
还有我看书上有2个公式:
(1)
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & 31) >> 3;

(2)
RowLength = 4 * ((Bmih.biWidth * Bmih.biBitCount + 31) / 32);

是计算行的长度,那个更能说明图象需要对齐。谢谢
...全文
167 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
78 -> 64, 呵呵,楼上的我改正一下,汗~~
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
看明白了。第一个公式的意思,不过第一个公式确实写错了

(1)
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & 31) > > 3;

改成:
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & ~31) >> 3;

>>3 的意思就是 除以 8, 和第二个公式 4 * .... /32 结果是一样的。


& ~31 的意思是 向 32(4个字节) 对齐,比如 32 ->(变成) 32 , 33 -> 32 , 64-> 64, 78->32。。。

(不过因为最后有 >>3 , 所以这一步 &~31 多余了)
cad_vc 2008-03-04
  • 打赏
  • 举报
回复
#define ALIGN_4BYTE(i) (((i)+3)&~3)
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
(1)
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & 31) > > 3;

(2)
RowLength = 4 * ((Bmih.biWidth * Bmih.biBitCount + 31) / 32);

这两个公式,我一般用第2个,意思比较明显。
Mnky 2008-03-04
  • 打赏
  • 举报
回复
我一直用 ((bits) + 31) / 32 * 4,也就是你的第二个。
第一个好像不太对,呵呵
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
位图信息头BITMAPINFOHEADER 结构中的
biSizeImage

指实际的位图数据大小(字节),以下的公式中计算:

biSizeImage=biWidth’ × biHeight

biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)。


jlu3389 2008-03-04
  • 打赏
  • 举报
回复
还得自己开辟内存来补齐。没有办法。谢谢楼上各位
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
既然使用了这个公式,或者另一个公式2
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & 31) > > 3;

这里面就有 Bmih.biBitCount ,也就是biBitCount值是已知的阿。这个值是24就是24图,是32就是32位图。1(黑白二色图), 4(16色图), 8(256色)。
jlu3389 2008-03-04
  • 打赏
  • 举报
回复
根据DLL给的文档,这个图片不是24就是32。
我用
RowLength = ((Bmih.biWidth * Bmih.biBitCount + 31) & 31) > > 3;
这个公式确很莫名其妙的给区分开了。
现在就是有一张图片,肯定是24的,可显示出来后图片就是歪的。不明白为什么。
PS:我用了StretchDIBits这个函数来改变图片的大小,当然也用了SetStretchBltMode。
dubiousway 2008-03-04
  • 打赏
  • 举报
回复
如果不知道BITMAPINFOHEADER中的 biBitCount ,怎么判断它的颜色要用到的位数呢?这个值决定是24 还是 32 ,
没这个值,怎么分辨,真是奇怪。
jlu3389 2008-03-04
  • 打赏
  • 举报
回复
我现在的情况是这样的。
从DLL中只能得到这个图片的Width和Height,其他都没有。
只能自己填充BITMAPINFOHEADER。

现在有2种图片,一种是alpha调整的24位BGR位图,另一种是32位ARGB位图,分别有不同的方法可以得到他们的象素,这个方式是DLL提供的,我现在不知道如何分辨他们。

而且还有一张另类的图片,就是用这2种方法得到的都是错了,不是歪的就是黑白颜色,现在知道了是需要对齐,可如何在给定的Buffer中操作这个我没干过,谁能指点了以下。
内容概要:本白皮书系统梳理了中国建筑声学行业的发展现状,重点围绕隔音材料的技术体系、市场格局与十大代表企业展开研究。文章厘清了隔音、吸音与防撞三大功能的概念边界,阐述了声音传播的物理机制及声学工程的材料、构造、施工与验证四层级结构;详细介绍了阻尼隔音板、隔音毡、吸音棉、减震构件、防撞软包等核心产品及其性能指标,并分析了行业标准、合规要求与工程实践中的常见误区;最后通过对广州朗音阁等十家大湾区代表性企业的并列介绍,揭示了行业“综合一体型”“材料制造型”“品牌产品型”等多元发展模式,强调系统交付能力、合规性与环保安全正成为企业核心竞争力。; 适合人群:建筑声学与隔音材料领域的工程采购方、建筑设计单位、总承包单位、行业研究者及政策监管相关人员。; 使用场景及目标:①帮助采购方科学选型,规避“以材料参数替代系统性能”等常见误区;②指导设计单位在公检法办案区、文化娱乐、医疗教育等细分场景中制定合理的声学解决方案;③为行业研究者提供市场格局、技术趋势与企业模式的客观参考;④推动企业提升合规意识与系统交付能力。; 阅读建议:读者应结合自身角色选择重点章节阅读——采购方可聚焦第一章、第三章、第五章、第八章及第九章;设计单位宜通读第一至七章;研究者建议全面研读并关注第二章市场格局与第四章技术趋势;所有读者均需注意本报告不进行企业排名,企业介绍篇幅差异不代表实力优劣,具体决策应以实地考察与合同约定为准。

65,214

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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