当前位置:首页 > 编程开发

关于GetDIBits函数的使用问题

webgou17年前 (2009-10-10)编程开发957

最近在编程的时候需要获取位图的二进制数据, 在使用GetDIBits函数的时候发现一个古怪的问题, 虽然解决了其中的问题, 但是没有找到其中的原因.这里描述一些遇到的问题.
第一次:为了从位图句柄得到数据, 创建了内存设备描述句柄, 而后根据MSDN描述, 两次调用GetDIBits函数, 第一次得到位图的参数, 第二次获得二进制数据, 最后发现我在Debug模式下执行没有任何问题(实际上是有问题, 只是程序不会报错), 可是在Release下就会出现严重的错误: 操作的内存是只读的. 后来仍旧在Debug下跟踪发现, 在第二次调用GetDIBits的时候, 内存设备描述句柄被改变了. 为了发现这个问题, 调试的时候使用了VC 6.0 带的BoundsChecker. 于是修改程序, 通过GetObject获取位图数据, 直接一次调用GetDIBits, 解决问题.
第二次:原以为上面解决之后就一切搞定了, 很快就又出现一个问题, 有一位用户的机器上分辨率的色素是16位色, 我们的程序一执行就出错, 而且还是只读内存问题, 经过跟踪定位, 发现又是这个GetDIBits函数出现问题了. 事情非常凑巧, 我们读取的位图大小是77*22, 我们发现只要使用了这个函数, 程序就出错, 不用这个函数, 程序没有问题, 注意到又是内存问题, 我们怀疑是申请的内存小了, 造成越界了. 于是我们再次回到MSDN的路, 在前面传递空地址调用GetDIBits, 获取位图的数据看看, 结果发现它得到的位图的大小居然是78*22, 和GetObject得到的信息不一样. 问题的解决也很简单, 我们调整了位图大小(78*22). 出现这个问题的原因应该是字节对齐的原因.
于是第二次出现问题的原因时找到了, 可以第一次的原因呢? 因为按照第二次的原因, 我应该使用两次调用GetDIBits, 可是这样会不会会带第一次的情形呢? 测试中... 失败了, 确实会回到第一种情况!

 

[from:http://community.studyez.com/blogs/zhaoyang0618/archive/2007/05/28/_73518E4E_GetDIBits_FD51706584767F4F2875EE959898_.aspx]
Published 2007年5月28日 20:10 作者 zhaoyang0618

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=15

标签: c语言
分享给朋友:

“关于GetDIBits函数的使用问题” 的相关文章

Android滑动手势侦测方法介绍

在Android手机操作系统中支持各种滑动手势的操作。我们在这里为大家介绍的方法主要就是针对这些手势如何能在Android平台中侦测出来。下面就让我们大家一起来看看Android滑动手势具体的识别方法吧。Android SDK提供了一个listener类来侦测各种不同的手势:SimpleOnGest…

AppStore 内购验证的方法

AppStore 内购验证的方法…

__declspec关键字详细用法

    __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和 C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于M…

activex 控件(ocx)与容器

activex 控件(ocx)与容器 [B]容器:[/B] 1.控件容器,桌面程序 2.网页,一般指browser [B]两者之间通讯:[/B]1.事件做出响应 (ocx-˃容器)2.属性和方法的接口进行管理(容器-˃ocx)本质:1.进程内服务器2.COM组件...…

SOAP协议规范

SOAP协议规范1. 简介SOAP 以XML形式提供了一个简单、轻量的用于在分散或分布环境中交换结构化和类型信息的机制。SOAP本身并没有定义任何应用程序语义,如编程模型或特定语义的实现;实际上它通过提供一个有标准组件的包模型和在模块中编码数据的机制,定义了一个简单的表示应用程序语义的机制。这使SO…

ARM处理器杂谈

ARM ARM 结构, ARM处理器.现在,应用非常广泛,应用于嵌入式系统中,像手机,ATM取款机,车载设置,录音笔. ARM在维基百科里的定义: The ARM is a 32-bit reduced instruction set computer (RISC) instruction set…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。