wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:1102回复:4

基础理论:在VC里面实现对DIB位图的操作。

楼主#
更多 发布于:2015-03-09 20:04
阅读该文需先阅读:
http://www.ihalcon.com/read-2926.html
http://www.ihalcon.com/read-2925.html
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////由于MFC里面已经封装一个名叫:CBitMap的类。这个类可以对DDB位图进行各种操作,这些操作都是以类成员函数的形式提供的,所以使用起来非常方便。
本帖的主题是 在VC里面实现对DIB位图的操作。
主要的参考资料是:Visual C++ 数字图像处理 (何斌等著)
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
DIB图像的内部结构请参见帖首两个连接里面提到的内容。
wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-03-09 20:06
第一部分的详细解释:

图片:2015-03-09_200745.jpg

wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2015-03-09 20:08
第二部分的详细解释:

提取页面从 Visual C++ 数字图像处理 何斌等编着 PDF电子书.pdf

第三部分的详细解释:

图片:2015-03-09_200914.jpg



第四部分的详细解释:

图片:2015-03-09_200923.jpg

wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2015-03-09 20:38
参考:http://blog.csdn.net/wenzhou1219/article/details/26162869

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
一:如果读取DIB到内存里面
×××××××
要把DIB数据读入到内存中,那么就要分配相应的内存,把读入的数据写到对应的内存区中,这里SDK 提供的数据结构是各种结构体,结构体的各个字段对应磁盘文件中各个信息值。我们这里为了逻辑清楚,使用最常使用的DIB结构体。

图片:20140518195033656.png




如图,文件中的数据读到对应的内存结构中完成文件的读入,内存结构中的数据写到对应的文件中完成文件的保存。
其中

  1. 文件信息头数据读到BITMAPFILEHEADER结构体中
  2. 位图信息头读到BITMAPINFOHEADER结构体中
  3. 位图调色板读到RGBQUAD结构体数组中
  4. 位图数据读到根据位图信息头提供的信息而分配的相应大小的数据区中


BITMAPINFOHEADERRGBQUAD[0]作为BITMAPINFO结构体成员,这样一方面是为了和磁盘文件对应,另一方面也是为了访问调色板数据方便。

这里的磁盘文件中各个段在磁盘上保存位置必须是连续的,但是对应的内存中文件信息头、位图信息和位图数据三大块不一定要是连续的。因此,在读入文件中你既可以一次性读入磁盘文件到连续的内存中,也可以分开读入到三个分别连续的内存中,后面会做相关演示。就是说数据转移到内存里面的存储地址必须连续。××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
二:如果显示DIB要怎么把对应的内存结构中的像素数据显示出来呢?

图片:20140615142355890.png



这个图看起来很复杂,实际上在这里我也没想把它完全讲出来,如果你之前有一定的DIB使用经验,那么这幅图可以帮你更好的理解整个显示过程,如果没有DIB使用经验,那么不用仔细看这幅位图。从这幅图,我们知道显示的时候需要的数据是:内存中位图数据、内存中位图信息、内存中位图指定要显示区域、显示器上用于显示的区域



以上是DIB位图的读取和显示的原理,使用这个原理可以开发对应的函数,  当然了这个事情微软公司帮我们做了。
wenluderen
论坛版主
论坛版主
  • 最后登录2017-11-03
  • 发帖数295
  • 金币4948枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
4楼#
发布于:2015-03-09 20:59
微软提供的一些 DIB位图操作函数。
函数一:

图片:2015-03-09_204645.jpg

图片:2015-03-09_204656.jpg





函数二:

图片:2015-03-09_204751.jpg

图片:2015-03-09_204803.jpg





函数三:

图片:2015-03-09_204838.jpg





函数四:

图片:2015-03-09_205911.jpg

图片:2015-03-09_205922.jpg





函数五:

图片:2015-03-09_210034.jpg





步骤六:

图片:2015-03-09_210106.jpg

图片:2015-03-09_210117.jpg



步骤七:

图片:2015-03-09_210225.jpg

图片:2015-03-09_210234.jpg

游客

返回顶部